//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension ElasticLoadBalancingV2 {
    // MARK: Enums

    public enum ActionTypeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case authenticateCognito = "authenticate-cognito"
        case authenticateOidc = "authenticate-oidc"
        case fixedResponse = "fixed-response"
        case forward = "forward"
        case redirect = "redirect"
        public var description: String { return self.rawValue }
    }

    public enum AdvertiseTrustStoreCaNamesEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case off = "off"
        case on = "on"
        public var description: String { return self.rawValue }
    }

    public enum AnomalyResultEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case anomalous = "anomalous"
        case normal = "normal"
        public var description: String { return self.rawValue }
    }

    public enum AuthenticateCognitoActionConditionalBehaviorEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case allow = "allow"
        case authenticate = "authenticate"
        case deny = "deny"
        public var description: String { return self.rawValue }
    }

    public enum AuthenticateOidcActionConditionalBehaviorEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case allow = "allow"
        case authenticate = "authenticate"
        case deny = "deny"
        public var description: String { return self.rawValue }
    }

    public enum CapacityReservationStateEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "failed"
        case pending = "pending"
        case provisioned = "provisioned"
        case rebalancing = "rebalancing"
        public var description: String { return self.rawValue }
    }

    public enum DescribeTargetHealthInputIncludeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "All"
        case anomaly = "AnomalyDetection"
        public var description: String { return self.rawValue }
    }

    public enum EnablePrefixForIpv6SourceNatEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case off = "off"
        case on = "on"
        public var description: String { return self.rawValue }
    }

    public enum EnforceSecurityGroupInboundRulesOnPrivateLinkTrafficEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case off = "off"
        case on = "on"
        public var description: String { return self.rawValue }
    }

    public enum IpAddressType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case dualstack = "dualstack"
        case dualstackWithoutPublicIpv4 = "dualstack-without-public-ipv4"
        case ipv4 = "ipv4"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerSchemeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `internal` = "internal"
        case internetFacing = "internet-facing"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerStateEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "active"
        case activeImpaired = "active_impaired"
        case failed = "failed"
        case provisioning = "provisioning"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTypeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case application = "application"
        case gateway = "gateway"
        case network = "network"
        public var description: String { return self.rawValue }
    }

    public enum MitigationInEffectEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case no = "no"
        case yes = "yes"
        public var description: String { return self.rawValue }
    }

    public enum ProtocolEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case geneve = "GENEVE"
        case http = "HTTP"
        case https = "HTTPS"
        case tcp = "TCP"
        case tcpUdp = "TCP_UDP"
        case tls = "TLS"
        case udp = "UDP"
        public var description: String { return self.rawValue }
    }

    public enum RedirectActionStatusCodeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case http301 = "HTTP_301"
        case http302 = "HTTP_302"
        public var description: String { return self.rawValue }
    }

    public enum RemoveIpamPoolEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ipv4 = "ipv4"
        public var description: String { return self.rawValue }
    }

    public enum RevocationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case crl = "CRL"
        public var description: String { return self.rawValue }
    }

    public enum TargetAdministrativeOverrideReasonEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case internalError = "AdministrativeOverride.Unknown"
        case noOverrideEngaged = "AdministrativeOverride.NoOverride"
        case zonalShiftDelegatedToDns = "AdministrativeOverride.ZonalShiftDelegatedToDns"
        case zonalShiftEngaged = "AdministrativeOverride.ZonalShiftActive"
        public var description: String { return self.rawValue }
    }

    public enum TargetAdministrativeOverrideStateEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case noOverride = "no_override"
        case unknown = "unknown"
        case zonalShiftActive = "zonal_shift_active"
        case zonalShiftDelegatedToDns = "zonal_shift_delegated_to_dns"
        public var description: String { return self.rawValue }
    }

    public enum TargetGroupIpAddressTypeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ipv4 = "ipv4"
        case ipv6 = "ipv6"
        public var description: String { return self.rawValue }
    }

    public enum TargetHealthReasonEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case deregistrationInProgress = "Target.DeregistrationInProgress"
        case failedHealthChecks = "Target.FailedHealthChecks"
        case healthCheckDisabled = "Target.HealthCheckDisabled"
        case initialHealthChecking = "Elb.InitialHealthChecking"
        case internalError = "Elb.InternalError"
        case invalidState = "Target.InvalidState"
        case ipUnusable = "Target.IpUnusable"
        case notInUse = "Target.NotInUse"
        case notRegistered = "Target.NotRegistered"
        case registrationInProgress = "Elb.RegistrationInProgress"
        case responseCodeMismatch = "Target.ResponseCodeMismatch"
        case timeout = "Target.Timeout"
        public var description: String { return self.rawValue }
    }

    public enum TargetHealthStateEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case draining = "draining"
        case healthy = "healthy"
        case initial = "initial"
        case unavailable = "unavailable"
        case unhealthy = "unhealthy"
        case unhealthyDraining = "unhealthy.draining"
        case unused = "unused"
        public var description: String { return self.rawValue }
    }

    public enum TargetTypeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case alb = "alb"
        case instance = "instance"
        case ip = "ip"
        case lambda = "lambda"
        public var description: String { return self.rawValue }
    }

    public enum TransformTypeEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case hostHeaderRewrite = "host-header-rewrite"
        case urlRewrite = "url-rewrite"
        public var description: String { return self.rawValue }
    }

    public enum TrustStoreAssociationStatusEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "active"
        case removed = "removed"
        public var description: String { return self.rawValue }
    }

    public enum TrustStoreStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "ACTIVE"
        case creating = "CREATING"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct Action: AWSEncodableShape & AWSDecodableShape {
        /// [HTTPS listeners] Information for using Amazon Cognito to authenticate users. Specify only when Type is authenticate-cognito.
        public let authenticateCognitoConfig: AuthenticateCognitoActionConfig?
        /// [HTTPS listeners] Information about an identity provider that is compliant with OpenID Connect (OIDC). Specify only when Type is authenticate-oidc.
        public let authenticateOidcConfig: AuthenticateOidcActionConfig?
        /// [Application Load Balancer] Information for creating an action that returns a custom HTTP response. Specify only when Type is fixed-response.
        public let fixedResponseConfig: FixedResponseActionConfig?
        /// Information for creating an action that distributes requests among one or more target groups. For Network Load Balancers, you can specify a single target group. Specify only when Type is forward. If you specify both ForwardConfig and TargetGroupArn, you can specify only one target group using ForwardConfig and it must be the same target group specified in TargetGroupArn.
        public let forwardConfig: ForwardActionConfig?
        /// The order for the action. This value is required for rules with multiple actions. The action with the lowest value for order is performed first.
        public let order: Int?
        /// [Application Load Balancer] Information for creating a redirect action. Specify only when Type is redirect.
        public let redirectConfig: RedirectActionConfig?
        /// The Amazon Resource Name (ARN) of the target group. Specify only when Type is forward and you want to route to a single target group. To route to one or more target groups, use ForwardConfig instead.
        public let targetGroupArn: String?
        /// The type of action.
        public let type: ActionTypeEnum?

        @inlinable
        public init(authenticateCognitoConfig: AuthenticateCognitoActionConfig? = nil, authenticateOidcConfig: AuthenticateOidcActionConfig? = nil, fixedResponseConfig: FixedResponseActionConfig? = nil, forwardConfig: ForwardActionConfig? = nil, order: Int? = nil, redirectConfig: RedirectActionConfig? = nil, targetGroupArn: String? = nil, type: ActionTypeEnum? = nil) {
            self.authenticateCognitoConfig = authenticateCognitoConfig
            self.authenticateOidcConfig = authenticateOidcConfig
            self.fixedResponseConfig = fixedResponseConfig
            self.forwardConfig = forwardConfig
            self.order = order
            self.redirectConfig = redirectConfig
            self.targetGroupArn = targetGroupArn
            self.type = type
        }

        public func validate(name: String) throws {
            try self.fixedResponseConfig?.validate(name: "\(name).fixedResponseConfig")
            try self.validate(self.order, name: "order", parent: name, max: 50000)
            try self.validate(self.order, name: "order", parent: name, min: 1)
            try self.redirectConfig?.validate(name: "\(name).redirectConfig")
        }

        private enum CodingKeys: String, CodingKey {
            case authenticateCognitoConfig = "AuthenticateCognitoConfig"
            case authenticateOidcConfig = "AuthenticateOidcConfig"
            case fixedResponseConfig = "FixedResponseConfig"
            case forwardConfig = "ForwardConfig"
            case order = "Order"
            case redirectConfig = "RedirectConfig"
            case targetGroupArn = "TargetGroupArn"
            case type = "Type"
        }
    }

    public struct AddListenerCertificatesInput: AWSEncodableShape {
        /// The certificate to add. You can specify one certificate per call. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @OptionalCustomCoding<StandardArrayCoder<Certificate>>
        public var certificates: [Certificate]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?

        @inlinable
        public init(certificates: [Certificate]? = nil, listenerArn: String? = nil) {
            self.certificates = certificates
            self.listenerArn = listenerArn
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
            case listenerArn = "ListenerArn"
        }
    }

    public struct AddListenerCertificatesOutput: AWSDecodableShape {
        /// Information about the certificates in the certificate list.
        @OptionalCustomCoding<StandardArrayCoder<Certificate>>
        public var certificates: [Certificate]?

        @inlinable
        public init(certificates: [Certificate]? = nil) {
            self.certificates = certificates
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
        }
    }

    public struct AddTagsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var resourceArns: [String]?
        /// The tags.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(resourceArns: [String]? = nil, tags: [Tag]? = nil) {
            self.resourceArns = resourceArns
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArns = "ResourceArns"
            case tags = "Tags"
        }
    }

    public struct AddTagsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct AddTrustStoreRevocationsInput: AWSEncodableShape {
        /// The revocation file to add.
        @OptionalCustomCoding<StandardArrayCoder<RevocationContent>>
        public var revocationContents: [RevocationContent]?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(revocationContents: [RevocationContent]? = nil, trustStoreArn: String? = nil) {
            self.revocationContents = revocationContents
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case revocationContents = "RevocationContents"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct AddTrustStoreRevocationsOutput: AWSDecodableShape {
        /// Information about the revocation file added to the trust store.
        @OptionalCustomCoding<StandardArrayCoder<TrustStoreRevocation>>
        public var trustStoreRevocations: [TrustStoreRevocation]?

        @inlinable
        public init(trustStoreRevocations: [TrustStoreRevocation]? = nil) {
            self.trustStoreRevocations = trustStoreRevocations
        }

        private enum CodingKeys: String, CodingKey {
            case trustStoreRevocations = "TrustStoreRevocations"
        }
    }

    public struct AdministrativeOverride: AWSDecodableShape {
        /// A description of the override state that provides additional details.
        public let description: String?
        /// The reason code for the state.
        public let reason: TargetAdministrativeOverrideReasonEnum?
        /// The state of the override.
        public let state: TargetAdministrativeOverrideStateEnum?

        @inlinable
        public init(description: String? = nil, reason: TargetAdministrativeOverrideReasonEnum? = nil, state: TargetAdministrativeOverrideStateEnum? = nil) {
            self.description = description
            self.reason = reason
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case reason = "Reason"
            case state = "State"
        }
    }

    public struct AnomalyDetection: AWSDecodableShape {
        /// Indicates whether anomaly mitigation is in progress.
        public let mitigationInEffect: MitigationInEffectEnum?
        /// The latest anomaly detection result.
        public let result: AnomalyResultEnum?

        @inlinable
        public init(mitigationInEffect: MitigationInEffectEnum? = nil, result: AnomalyResultEnum? = nil) {
            self.mitigationInEffect = mitigationInEffect
            self.result = result
        }

        private enum CodingKeys: String, CodingKey {
            case mitigationInEffect = "MitigationInEffect"
            case result = "Result"
        }
    }

    public struct AuthenticateCognitoActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The query parameters (up to 10) to include in the redirect request to the authorization endpoint.
        @OptionalCustomCoding<StandardDictionaryCoder<String, String>>
        public var authenticationRequestExtraParams: [String: String]?
        /// The behavior if the user is not authenticated. The following are possible values:   deny - Return an HTTP 401 Unauthorized error.   allow - Allow the request to be forwarded to the target.   authenticate - Redirect the request to the IdP authorization endpoint. This is the default value.
        public let onUnauthenticatedRequest: AuthenticateCognitoActionConditionalBehaviorEnum?
        /// The set of user claims to be requested from the IdP. The default is openid. To verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.
        public let scope: String?
        /// The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.
        public let sessionCookieName: String?
        /// The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).
        public let sessionTimeout: Int64?
        /// The Amazon Resource Name (ARN) of the Amazon Cognito user pool.
        public let userPoolArn: String?
        /// The ID of the Amazon Cognito user pool client.
        public let userPoolClientId: String?
        /// The domain prefix or fully-qualified domain name of the Amazon Cognito user pool.
        public let userPoolDomain: String?

        @inlinable
        public init(authenticationRequestExtraParams: [String: String]? = nil, onUnauthenticatedRequest: AuthenticateCognitoActionConditionalBehaviorEnum? = nil, scope: String? = nil, sessionCookieName: String? = nil, sessionTimeout: Int64? = nil, userPoolArn: String? = nil, userPoolClientId: String? = nil, userPoolDomain: String? = nil) {
            self.authenticationRequestExtraParams = authenticationRequestExtraParams
            self.onUnauthenticatedRequest = onUnauthenticatedRequest
            self.scope = scope
            self.sessionCookieName = sessionCookieName
            self.sessionTimeout = sessionTimeout
            self.userPoolArn = userPoolArn
            self.userPoolClientId = userPoolClientId
            self.userPoolDomain = userPoolDomain
        }

        private enum CodingKeys: String, CodingKey {
            case authenticationRequestExtraParams = "AuthenticationRequestExtraParams"
            case onUnauthenticatedRequest = "OnUnauthenticatedRequest"
            case scope = "Scope"
            case sessionCookieName = "SessionCookieName"
            case sessionTimeout = "SessionTimeout"
            case userPoolArn = "UserPoolArn"
            case userPoolClientId = "UserPoolClientId"
            case userPoolDomain = "UserPoolDomain"
        }
    }

    public struct AuthenticateOidcActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The query parameters (up to 10) to include in the redirect request to the authorization endpoint.
        @OptionalCustomCoding<StandardDictionaryCoder<String, String>>
        public var authenticationRequestExtraParams: [String: String]?
        /// The authorization endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let authorizationEndpoint: String?
        /// The OAuth 2.0 client identifier.
        public let clientId: String?
        /// The OAuth 2.0 client secret. This parameter is required if you are creating a rule. If you are modifying a rule, you can omit this parameter if you set UseExistingClientSecret to true.
        public let clientSecret: String?
        /// The OIDC issuer identifier of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let issuer: String?
        /// The behavior if the user is not authenticated. The following are possible values:   deny - Return an HTTP 401 Unauthorized error.   allow - Allow the request to be forwarded to the target.   authenticate - Redirect the request to the IdP authorization endpoint. This is the default value.
        public let onUnauthenticatedRequest: AuthenticateOidcActionConditionalBehaviorEnum?
        /// The set of user claims to be requested from the IdP. The default is openid. To verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.
        public let scope: String?
        /// The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.
        public let sessionCookieName: String?
        /// The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).
        public let sessionTimeout: Int64?
        /// The token endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let tokenEndpoint: String?
        /// Indicates whether to use the existing client secret when modifying a rule. If you are creating a rule, you can omit this parameter or set it to false.
        public let useExistingClientSecret: Bool?
        /// The user info endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let userInfoEndpoint: String?

        @inlinable
        public init(authenticationRequestExtraParams: [String: String]? = nil, authorizationEndpoint: String? = nil, clientId: String? = nil, clientSecret: String? = nil, issuer: String? = nil, onUnauthenticatedRequest: AuthenticateOidcActionConditionalBehaviorEnum? = nil, scope: String? = nil, sessionCookieName: String? = nil, sessionTimeout: Int64? = nil, tokenEndpoint: String? = nil, useExistingClientSecret: Bool? = nil, userInfoEndpoint: String? = nil) {
            self.authenticationRequestExtraParams = authenticationRequestExtraParams
            self.authorizationEndpoint = authorizationEndpoint
            self.clientId = clientId
            self.clientSecret = clientSecret
            self.issuer = issuer
            self.onUnauthenticatedRequest = onUnauthenticatedRequest
            self.scope = scope
            self.sessionCookieName = sessionCookieName
            self.sessionTimeout = sessionTimeout
            self.tokenEndpoint = tokenEndpoint
            self.useExistingClientSecret = useExistingClientSecret
            self.userInfoEndpoint = userInfoEndpoint
        }

        private enum CodingKeys: String, CodingKey {
            case authenticationRequestExtraParams = "AuthenticationRequestExtraParams"
            case authorizationEndpoint = "AuthorizationEndpoint"
            case clientId = "ClientId"
            case clientSecret = "ClientSecret"
            case issuer = "Issuer"
            case onUnauthenticatedRequest = "OnUnauthenticatedRequest"
            case scope = "Scope"
            case sessionCookieName = "SessionCookieName"
            case sessionTimeout = "SessionTimeout"
            case tokenEndpoint = "TokenEndpoint"
            case useExistingClientSecret = "UseExistingClientSecret"
            case userInfoEndpoint = "UserInfoEndpoint"
        }
    }

    public struct AvailabilityZone: AWSDecodableShape {
        /// [Network Load Balancers] If you need static IP addresses for your load balancer, you can specify one Elastic IP address per Availability Zone when you create an internal-facing load balancer. For internal load balancers, you can specify a private IP address from the IPv4 range of the subnet.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancerAddress>>
        public var loadBalancerAddresses: [LoadBalancerAddress]?
        /// [Application Load Balancers on Outposts] The ID of the Outpost.
        public let outpostId: String?
        /// [Network Load Balancers with UDP listeners] The IPv6 prefixes to use for source NAT. For each subnet, specify an IPv6 prefix (/80 netmask) from the subnet CIDR block or auto_assigned to use an IPv6 prefix selected at random from the subnet CIDR block.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var sourceNatIpv6Prefixes: [String]?
        /// The ID of the subnet. You can specify one subnet per Availability Zone.
        public let subnetId: String?
        /// The name of the Availability Zone.
        public let zoneName: String?

        @inlinable
        public init(loadBalancerAddresses: [LoadBalancerAddress]? = nil, outpostId: String? = nil, sourceNatIpv6Prefixes: [String]? = nil, subnetId: String? = nil, zoneName: String? = nil) {
            self.loadBalancerAddresses = loadBalancerAddresses
            self.outpostId = outpostId
            self.sourceNatIpv6Prefixes = sourceNatIpv6Prefixes
            self.subnetId = subnetId
            self.zoneName = zoneName
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerAddresses = "LoadBalancerAddresses"
            case outpostId = "OutpostId"
            case sourceNatIpv6Prefixes = "SourceNatIpv6Prefixes"
            case subnetId = "SubnetId"
            case zoneName = "ZoneName"
        }
    }

    public struct CapacityReservationStatus: AWSDecodableShape {
        /// The status code.
        public let code: CapacityReservationStateEnum?
        /// The reason code for the status.
        public let reason: String?

        @inlinable
        public init(code: CapacityReservationStateEnum? = nil, reason: String? = nil) {
            self.code = code
            self.reason = reason
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case reason = "Reason"
        }
    }

    public struct Certificate: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the certificate.
        public let certificateArn: String?
        /// Indicates whether the certificate is the default certificate. Do not set this value when specifying a certificate as an input. This value is not included in the output when describing a listener, but is included when describing listener certificates.
        public let isDefault: Bool?

        @inlinable
        public init(certificateArn: String? = nil, isDefault: Bool? = nil) {
            self.certificateArn = certificateArn
            self.isDefault = isDefault
        }

        private enum CodingKeys: String, CodingKey {
            case certificateArn = "CertificateArn"
            case isDefault = "IsDefault"
        }
    }

    public struct Cipher: AWSDecodableShape {
        /// The name of the cipher.
        public let name: String?
        /// The priority of the cipher.
        public let priority: Int?

        @inlinable
        public init(name: String? = nil, priority: Int? = nil) {
            self.name = name
            self.priority = priority
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case priority = "Priority"
        }
    }

    public struct CreateListenerInput: AWSEncodableShape {
        /// [TLS listeners] The name of the Application-Layer Protocol Negotiation (ALPN) policy. You can specify one policy name. The following are the possible values:    HTTP1Only     HTTP2Only     HTTP2Optional     HTTP2Preferred     None    For more information, see ALPN policies in the Network Load Balancers Guide.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var alpnPolicy: [String]?
        /// [HTTPS and TLS listeners] The default certificate for the listener. You must provide exactly one certificate. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @OptionalCustomCoding<StandardArrayCoder<Certificate>>
        public var certificates: [Certificate]?
        /// The actions for the default rule.
        @OptionalCustomCoding<StandardArrayCoder<Action>>
        public var defaultActions: [Action]?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// [HTTPS listeners] The mutual authentication configuration information.
        public let mutualAuthentication: MutualAuthenticationAttributes?
        /// The port on which the load balancer is listening. You can't specify a port for a Gateway Load Balancer.
        public let port: Int?
        /// The protocol for connections from clients to the load balancer. For Application Load Balancers, the supported protocols are HTTP and HTTPS. For Network Load Balancers, the supported protocols are TCP, TLS, UDP, and TCP_UDP. You can’t specify the UDP or TCP_UDP protocol if dual-stack mode is enabled. You can't specify a protocol for a Gateway Load Balancer.
        public let `protocol`: ProtocolEnum?
        /// [HTTPS and TLS listeners] The security policy that defines which protocols and ciphers are supported. For more information, see Security policies in the Application Load Balancers Guide and Security policies in the Network Load Balancers Guide.
        public let sslPolicy: String?
        /// The tags to assign to the listener.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(alpnPolicy: [String]? = nil, certificates: [Certificate]? = nil, defaultActions: [Action]? = nil, loadBalancerArn: String? = nil, mutualAuthentication: MutualAuthenticationAttributes? = nil, port: Int? = nil, protocol: ProtocolEnum? = nil, sslPolicy: String? = nil, tags: [Tag]? = nil) {
            self.alpnPolicy = alpnPolicy
            self.certificates = certificates
            self.defaultActions = defaultActions
            self.loadBalancerArn = loadBalancerArn
            self.mutualAuthentication = mutualAuthentication
            self.port = port
            self.`protocol` = `protocol`
            self.sslPolicy = sslPolicy
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.defaultActions?.forEach {
                try $0.validate(name: "\(name).defaultActions[]")
            }
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case alpnPolicy = "AlpnPolicy"
            case certificates = "Certificates"
            case defaultActions = "DefaultActions"
            case loadBalancerArn = "LoadBalancerArn"
            case mutualAuthentication = "MutualAuthentication"
            case port = "Port"
            case `protocol` = "Protocol"
            case sslPolicy = "SslPolicy"
            case tags = "Tags"
        }
    }

    public struct CreateListenerOutput: AWSDecodableShape {
        /// Information about the listener.
        @OptionalCustomCoding<StandardArrayCoder<Listener>>
        public var listeners: [Listener]?

        @inlinable
        public init(listeners: [Listener]? = nil) {
            self.listeners = listeners
        }

        private enum CodingKeys: String, CodingKey {
            case listeners = "Listeners"
        }
    }

    public struct CreateLoadBalancerInput: AWSEncodableShape {
        /// [Application Load Balancers on Outposts] The ID of the customer-owned address pool (CoIP pool).
        public let customerOwnedIpv4Pool: String?
        /// [Network Load Balancers with UDP listeners] Indicates whether to use an IPv6 prefix  from each subnet for source NAT. The IP address type must be dualstack.  The default value is off.
        public let enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum?
        /// The IP address type. Internal load balancers must use ipv4. [Application Load Balancers] The possible values are ipv4 (IPv4 addresses),  dualstack (IPv4 and IPv6 addresses), and dualstack-without-public-ipv4  (public IPv6 addresses and private IPv4 and IPv6 addresses). [Network Load Balancers and Gateway Load Balancers] The possible values are ipv4  (IPv4 addresses) and dualstack (IPv4 and IPv6 addresses).
        public let ipAddressType: IpAddressType?
        /// [Application Load Balancers] The IPAM pools to use with the load balancer.
        public let ipamPools: IpamPools?
        /// The name of the load balancer. This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, must not begin or end with a hyphen, and must not begin with "internal-".
        public let name: String?
        /// The nodes of an Internet-facing load balancer have public IP addresses. The DNS name of an Internet-facing load balancer is publicly resolvable to the public IP addresses of the nodes. Therefore, Internet-facing load balancers can route requests from clients over the internet. The nodes of an internal load balancer have only private IP addresses. The DNS name of an internal load balancer is publicly resolvable to the private IP addresses of the nodes. Therefore, internal load balancers can route requests only from clients with access to the VPC for the load balancer. The default is an Internet-facing load balancer. You can't specify a scheme for a Gateway Load Balancer.
        public let scheme: LoadBalancerSchemeEnum?
        /// [Application Load Balancers and Network Load Balancers] The IDs of the security groups for the load balancer.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var securityGroups: [String]?
        /// The IDs of the subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings, but not both. [Application Load Balancers] You must specify subnets from at least two Availability Zones. You can't specify Elastic IP addresses for your subnets. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers] You can specify subnets from one or more Availability Zones. You can specify one Elastic IP address per subnet if you need static IP addresses for your internet-facing load balancer. For internal load balancers, you can specify one private IP address per subnet from the IPv4 range of the subnet. For internet-facing load balancer, you can specify one IPv6 address per subnet. [Gateway Load Balancers] You can specify subnets from one or more Availability Zones. You can't specify Elastic IP addresses for your subnets.
        @OptionalCustomCoding<StandardArrayCoder<SubnetMapping>>
        public var subnetMappings: [SubnetMapping]?
        /// The IDs of the subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings, but not both. To specify an Elastic IP address, specify subnet mappings instead of subnets. [Application Load Balancers] You must specify subnets from at least two Availability Zones. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers and Gateway Load Balancers] You can specify subnets from one or more  Availability Zones.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var subnets: [String]?
        /// The tags to assign to the load balancer.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?
        /// The type of load balancer. The default is application.
        public let type: LoadBalancerTypeEnum?

        @inlinable
        public init(customerOwnedIpv4Pool: String? = nil, enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum? = nil, ipAddressType: IpAddressType? = nil, ipamPools: IpamPools? = nil, name: String? = nil, scheme: LoadBalancerSchemeEnum? = nil, securityGroups: [String]? = nil, subnetMappings: [SubnetMapping]? = nil, subnets: [String]? = nil, tags: [Tag]? = nil, type: LoadBalancerTypeEnum? = nil) {
            self.customerOwnedIpv4Pool = customerOwnedIpv4Pool
            self.enablePrefixForIpv6SourceNat = enablePrefixForIpv6SourceNat
            self.ipAddressType = ipAddressType
            self.ipamPools = ipamPools
            self.name = name
            self.scheme = scheme
            self.securityGroups = securityGroups
            self.subnetMappings = subnetMappings
            self.subnets = subnets
            self.tags = tags
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.customerOwnedIpv4Pool, name: "customerOwnedIpv4Pool", parent: name, max: 256)
            try self.validate(self.customerOwnedIpv4Pool, name: "customerOwnedIpv4Pool", parent: name, pattern: "^(ipv4pool-coip-)[a-zA-Z0-9]+$")
            try self.ipamPools?.validate(name: "\(name).ipamPools")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case customerOwnedIpv4Pool = "CustomerOwnedIpv4Pool"
            case enablePrefixForIpv6SourceNat = "EnablePrefixForIpv6SourceNat"
            case ipAddressType = "IpAddressType"
            case ipamPools = "IpamPools"
            case name = "Name"
            case scheme = "Scheme"
            case securityGroups = "SecurityGroups"
            case subnetMappings = "SubnetMappings"
            case subnets = "Subnets"
            case tags = "Tags"
            case type = "Type"
        }
    }

    public struct CreateLoadBalancerOutput: AWSDecodableShape {
        /// Information about the load balancer.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancer>>
        public var loadBalancers: [LoadBalancer]?

        @inlinable
        public init(loadBalancers: [LoadBalancer]? = nil) {
            self.loadBalancers = loadBalancers
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancers = "LoadBalancers"
        }
    }

    public struct CreateRuleInput: AWSEncodableShape {
        /// The actions.
        @OptionalCustomCoding<StandardArrayCoder<Action>>
        public var actions: [Action]?
        /// The conditions.
        @OptionalCustomCoding<StandardArrayCoder<RuleCondition>>
        public var conditions: [RuleCondition]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?
        /// The rule priority. A listener can't have multiple rules with the same priority.
        public let priority: Int?
        /// The tags to assign to the rule.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?
        /// The transforms to apply to requests that match this rule. You can add one host header rewrite transform  and one URL rewrite transform.
        @OptionalCustomCoding<StandardArrayCoder<RuleTransform>>
        public var transforms: [RuleTransform]?

        @inlinable
        public init(actions: [Action]? = nil, conditions: [RuleCondition]? = nil, listenerArn: String? = nil, priority: Int? = nil, tags: [Tag]? = nil, transforms: [RuleTransform]? = nil) {
            self.actions = actions
            self.conditions = conditions
            self.listenerArn = listenerArn
            self.priority = priority
            self.tags = tags
            self.transforms = transforms
        }

        public func validate(name: String) throws {
            try self.actions?.forEach {
                try $0.validate(name: "\(name).actions[]")
            }
            try self.conditions?.forEach {
                try $0.validate(name: "\(name).conditions[]")
            }
            try self.validate(self.priority, name: "priority", parent: name, max: 50000)
            try self.validate(self.priority, name: "priority", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case actions = "Actions"
            case conditions = "Conditions"
            case listenerArn = "ListenerArn"
            case priority = "Priority"
            case tags = "Tags"
            case transforms = "Transforms"
        }
    }

    public struct CreateRuleOutput: AWSDecodableShape {
        /// Information about the rule.
        @OptionalCustomCoding<StandardArrayCoder<Rule>>
        public var rules: [Rule]?

        @inlinable
        public init(rules: [Rule]? = nil) {
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case rules = "Rules"
        }
    }

    public struct CreateTargetGroupInput: AWSEncodableShape {
        /// Indicates whether health checks are enabled. If the target type is lambda, health checks are disabled by default but can be enabled. If the target type is instance, ip, or alb, health checks are always enabled and can't be disabled.
        public let healthCheckEnabled: Bool?
        /// The approximate amount of time, in seconds, between health checks of an individual target. The range is 5-300. If the target group protocol is TCP, TLS, UDP, TCP_UDP, HTTP or HTTPS, the default is 30 seconds.  If the target group protocol is GENEVE, the default is 10 seconds.  If the target type is lambda, the default is 35 seconds.
        public let healthCheckIntervalSeconds: Int?
        /// [HTTP/HTTPS health checks] The destination for health checks on the targets. [HTTP1 or HTTP2 protocol version] The ping path. The default is /. [GRPC protocol version] The path of a custom health check method with the format /package.service/method. The default is /Amazon Web Services.ALB/healthcheck.
        public let healthCheckPath: String?
        /// The port the load balancer uses when performing health checks on targets. If the protocol is HTTP, HTTPS, TCP, TLS, UDP, or TCP_UDP, the default is traffic-port, which is the port on which each target receives traffic from the load balancer. If the protocol is GENEVE, the default is port 80.
        public let healthCheckPort: String?
        /// The protocol the load balancer uses when performing health checks on targets. For Application Load Balancers, the default is HTTP. For Network Load Balancers and Gateway Load Balancers, the default is TCP. The TCP protocol is not supported for health checks if the protocol of the target group is HTTP or HTTPS. The GENEVE, TLS, UDP, and TCP_UDP protocols are not supported for health checks.
        public let healthCheckProtocol: ProtocolEnum?
        /// The amount of time, in seconds, during which no response from a target means a failed  health check. The range is 2–120 seconds. For target groups with a protocol of HTTP, the  default is 6 seconds. For target groups with a protocol of TCP, TLS or HTTPS, the default  is 10 seconds. For target groups with a protocol of GENEVE, the default is 5 seconds. If  the target type is lambda, the default is 30 seconds.
        public let healthCheckTimeoutSeconds: Int?
        /// The number of consecutive health check successes required before considering a target healthy. The range is  2-10. If the target group protocol is TCP, TCP_UDP, UDP, TLS, HTTP or HTTPS, the default is 5. For target groups  with a protocol of GENEVE, the default is 5. If the target type  is lambda, the default is 5.
        public let healthyThresholdCount: Int?
        /// The IP address type. The default value is ipv4.
        public let ipAddressType: TargetGroupIpAddressTypeEnum?
        /// [HTTP/HTTPS health checks] The HTTP or gRPC codes to use when checking for a successful  response from a target. For target groups with a protocol of TCP, TCP_UDP, UDP or TLS the range  is 200-599. For target groups with a protocol of HTTP or HTTPS, the range is 200-499. For target  groups with a protocol of GENEVE, the range is 200-399.
        public let matcher: Matcher?
        /// The name of the target group. This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen.
        public let name: String?
        /// The port on which the targets receive traffic. This port is used unless you specify a port override when registering the target. If the target is a Lambda function, this parameter does not apply. If the protocol is GENEVE, the supported port is 6081.
        public let port: Int?
        /// The protocol to use for routing traffic to the targets. For Application Load Balancers, the supported protocols are HTTP and HTTPS. For Network Load Balancers, the supported protocols are TCP, TLS, UDP, or TCP_UDP. For Gateway Load Balancers, the supported protocol is GENEVE. A TCP_UDP listener must be associated with a TCP_UDP target group. If the target is a Lambda function, this parameter does not apply.
        public let `protocol`: ProtocolEnum?
        /// [HTTP/HTTPS protocol] The protocol version. Specify GRPC to send requests to targets using gRPC. Specify HTTP2 to send requests to targets using HTTP/2. The default is HTTP1, which sends requests to targets using HTTP/1.1.
        public let protocolVersion: String?
        /// The tags to assign to the target group.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?
        /// The type of target that you must specify when registering targets with this target group. You can't specify targets for a target group using more than one target type.    instance - Register targets by instance ID. This is the default value.    ip - Register targets by IP address. You can specify IP addresses from the subnets of the virtual private cloud (VPC) for the target group, the RFC 1918 range (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16), and the RFC 6598 range (100.64.0.0/10). You can't specify publicly routable IP addresses.    lambda - Register a single Lambda function as a target.    alb - Register a single Application Load Balancer as a target.
        public let targetType: TargetTypeEnum?
        /// The number of consecutive health check failures required before considering a target unhealthy. The range is  2-10. If the target group protocol is TCP, TCP_UDP, UDP, TLS, HTTP or HTTPS, the default is 2. For target groups  with a protocol of GENEVE, the default is 2. If the target type  is lambda, the default is 5.
        public let unhealthyThresholdCount: Int?
        /// The identifier of the virtual private cloud (VPC). If the target is a Lambda function, this parameter does not apply. Otherwise, this parameter is required.
        public let vpcId: String?

        @inlinable
        public init(healthCheckEnabled: Bool? = nil, healthCheckIntervalSeconds: Int? = nil, healthCheckPath: String? = nil, healthCheckPort: String? = nil, healthCheckProtocol: ProtocolEnum? = nil, healthCheckTimeoutSeconds: Int? = nil, healthyThresholdCount: Int? = nil, ipAddressType: TargetGroupIpAddressTypeEnum? = nil, matcher: Matcher? = nil, name: String? = nil, port: Int? = nil, protocol: ProtocolEnum? = nil, protocolVersion: String? = nil, tags: [Tag]? = nil, targetType: TargetTypeEnum? = nil, unhealthyThresholdCount: Int? = nil, vpcId: String? = nil) {
            self.healthCheckEnabled = healthCheckEnabled
            self.healthCheckIntervalSeconds = healthCheckIntervalSeconds
            self.healthCheckPath = healthCheckPath
            self.healthCheckPort = healthCheckPort
            self.healthCheckProtocol = healthCheckProtocol
            self.healthCheckTimeoutSeconds = healthCheckTimeoutSeconds
            self.healthyThresholdCount = healthyThresholdCount
            self.ipAddressType = ipAddressType
            self.matcher = matcher
            self.name = name
            self.port = port
            self.`protocol` = `protocol`
            self.protocolVersion = protocolVersion
            self.tags = tags
            self.targetType = targetType
            self.unhealthyThresholdCount = unhealthyThresholdCount
            self.vpcId = vpcId
        }

        public func validate(name: String) throws {
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, max: 300)
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, min: 5)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, max: 1024)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, min: 1)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, max: 120)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, min: 2)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, max: 10)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, min: 2)
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, max: 10)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, min: 2)
        }

        private enum CodingKeys: String, CodingKey {
            case healthCheckEnabled = "HealthCheckEnabled"
            case healthCheckIntervalSeconds = "HealthCheckIntervalSeconds"
            case healthCheckPath = "HealthCheckPath"
            case healthCheckPort = "HealthCheckPort"
            case healthCheckProtocol = "HealthCheckProtocol"
            case healthCheckTimeoutSeconds = "HealthCheckTimeoutSeconds"
            case healthyThresholdCount = "HealthyThresholdCount"
            case ipAddressType = "IpAddressType"
            case matcher = "Matcher"
            case name = "Name"
            case port = "Port"
            case `protocol` = "Protocol"
            case protocolVersion = "ProtocolVersion"
            case tags = "Tags"
            case targetType = "TargetType"
            case unhealthyThresholdCount = "UnhealthyThresholdCount"
            case vpcId = "VpcId"
        }
    }

    public struct CreateTargetGroupOutput: AWSDecodableShape {
        /// Information about the target group.
        @OptionalCustomCoding<StandardArrayCoder<TargetGroup>>
        public var targetGroups: [TargetGroup]?

        @inlinable
        public init(targetGroups: [TargetGroup]? = nil) {
            self.targetGroups = targetGroups
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroups = "TargetGroups"
        }
    }

    public struct CreateTrustStoreInput: AWSEncodableShape {
        /// The Amazon S3 bucket for the ca certificates bundle.
        public let caCertificatesBundleS3Bucket: String?
        /// The Amazon S3 path for the ca certificates bundle.
        public let caCertificatesBundleS3Key: String?
        /// The Amazon S3 object version for the ca certificates bundle. If undefined the current version is used.
        public let caCertificatesBundleS3ObjectVersion: String?
        /// The name of the trust store. This name must be unique per region and can't be changed after creation.
        public let name: String?
        /// The tags to assign to the trust store.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(caCertificatesBundleS3Bucket: String? = nil, caCertificatesBundleS3Key: String? = nil, caCertificatesBundleS3ObjectVersion: String? = nil, name: String? = nil, tags: [Tag]? = nil) {
            self.caCertificatesBundleS3Bucket = caCertificatesBundleS3Bucket
            self.caCertificatesBundleS3Key = caCertificatesBundleS3Key
            self.caCertificatesBundleS3ObjectVersion = caCertificatesBundleS3ObjectVersion
            self.name = name
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 32)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^([a-zA-Z0-9]+-)*[a-zA-Z0-9]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case caCertificatesBundleS3Bucket = "CaCertificatesBundleS3Bucket"
            case caCertificatesBundleS3Key = "CaCertificatesBundleS3Key"
            case caCertificatesBundleS3ObjectVersion = "CaCertificatesBundleS3ObjectVersion"
            case name = "Name"
            case tags = "Tags"
        }
    }

    public struct CreateTrustStoreOutput: AWSDecodableShape {
        /// Information about the trust store created.
        @OptionalCustomCoding<StandardArrayCoder<TrustStore>>
        public var trustStores: [TrustStore]?

        @inlinable
        public init(trustStores: [TrustStore]? = nil) {
            self.trustStores = trustStores
        }

        private enum CodingKeys: String, CodingKey {
            case trustStores = "TrustStores"
        }
    }

    public struct DeleteListenerInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?

        @inlinable
        public init(listenerArn: String? = nil) {
            self.listenerArn = listenerArn
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArn = "ListenerArn"
        }
    }

    public struct DeleteListenerOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteLoadBalancerInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?

        @inlinable
        public init(loadBalancerArn: String? = nil) {
            self.loadBalancerArn = loadBalancerArn
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct DeleteLoadBalancerOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteRuleInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String?

        @inlinable
        public init(ruleArn: String? = nil) {
            self.ruleArn = ruleArn
        }

        private enum CodingKeys: String, CodingKey {
            case ruleArn = "RuleArn"
        }
    }

    public struct DeleteRuleOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteSharedTrustStoreAssociationInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        public let resourceArn: String?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(resourceArn: String? = nil, trustStoreArn: String? = nil) {
            self.resourceArn = resourceArn
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct DeleteSharedTrustStoreAssociationOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteTargetGroupInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?

        @inlinable
        public init(targetGroupArn: String? = nil) {
            self.targetGroupArn = targetGroupArn
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
        }
    }

    public struct DeleteTargetGroupOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteTrustStoreInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(trustStoreArn: String? = nil) {
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct DeleteTrustStoreOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeregisterTargetsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The targets. If you specified a port override when you registered a target, you must specify both the target ID and the port when you deregister it.
        @OptionalCustomCoding<StandardArrayCoder<TargetDescription>>
        public var targets: [TargetDescription]?

        @inlinable
        public init(targetGroupArn: String? = nil, targets: [TargetDescription]? = nil) {
            self.targetGroupArn = targetGroupArn
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
            case targets = "Targets"
        }
    }

    public struct DeregisterTargetsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DescribeAccountLimitsInput: AWSEncodableShape {
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        @inlinable
        public init(marker: String? = nil, pageSize: Int? = nil) {
            self.marker = marker
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeAccountLimitsOutput: AWSDecodableShape {
        /// Information about the limits.
        @OptionalCustomCoding<StandardArrayCoder<Limit>>
        public var limits: [Limit]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        @inlinable
        public init(limits: [Limit]? = nil, nextMarker: String? = nil) {
            self.limits = limits
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case limits = "Limits"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeCapacityReservationInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?

        @inlinable
        public init(loadBalancerArn: String? = nil) {
            self.loadBalancerArn = loadBalancerArn
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct DescribeCapacityReservationOutput: AWSDecodableShape {
        /// The state of the capacity reservation.
        @OptionalCustomCoding<StandardArrayCoder<ZonalCapacityReservationState>>
        public var capacityReservationState: [ZonalCapacityReservationState]?
        /// The amount of daily capacity decreases remaining.
        public let decreaseRequestsRemaining: Int?
        /// The last time the capacity reservation was modified.
        public let lastModifiedTime: Date?
        /// The requested minimum capacity reservation for the load balancer
        public let minimumLoadBalancerCapacity: MinimumLoadBalancerCapacity?

        @inlinable
        public init(capacityReservationState: [ZonalCapacityReservationState]? = nil, decreaseRequestsRemaining: Int? = nil, lastModifiedTime: Date? = nil, minimumLoadBalancerCapacity: MinimumLoadBalancerCapacity? = nil) {
            self.capacityReservationState = capacityReservationState
            self.decreaseRequestsRemaining = decreaseRequestsRemaining
            self.lastModifiedTime = lastModifiedTime
            self.minimumLoadBalancerCapacity = minimumLoadBalancerCapacity
        }

        private enum CodingKeys: String, CodingKey {
            case capacityReservationState = "CapacityReservationState"
            case decreaseRequestsRemaining = "DecreaseRequestsRemaining"
            case lastModifiedTime = "LastModifiedTime"
            case minimumLoadBalancerCapacity = "MinimumLoadBalancerCapacity"
        }
    }

    public struct DescribeListenerAttributesInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?

        @inlinable
        public init(listenerArn: String? = nil) {
            self.listenerArn = listenerArn
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArn = "ListenerArn"
        }
    }

    public struct DescribeListenerAttributesOutput: AWSDecodableShape {
        /// Information about the listener attributes.
        @OptionalCustomCoding<StandardArrayCoder<ListenerAttribute>>
        public var attributes: [ListenerAttribute]?

        @inlinable
        public init(attributes: [ListenerAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct DescribeListenerCertificatesInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the listener.
        public let listenerArn: String?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        @inlinable
        public init(listenerArn: String? = nil, marker: String? = nil, pageSize: Int? = nil) {
            self.listenerArn = listenerArn
            self.marker = marker
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArn = "ListenerArn"
            case marker = "Marker"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeListenerCertificatesOutput: AWSDecodableShape {
        /// Information about the certificates.
        @OptionalCustomCoding<StandardArrayCoder<Certificate>>
        public var certificates: [Certificate]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        @inlinable
        public init(certificates: [Certificate]? = nil, nextMarker: String? = nil) {
            self.certificates = certificates
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeListenersInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the listeners.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var listenerArns: [String]?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        @inlinable
        public init(listenerArns: [String]? = nil, loadBalancerArn: String? = nil, marker: String? = nil, pageSize: Int? = nil) {
            self.listenerArns = listenerArns
            self.loadBalancerArn = loadBalancerArn
            self.marker = marker
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArns = "ListenerArns"
            case loadBalancerArn = "LoadBalancerArn"
            case marker = "Marker"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeListenersOutput: AWSDecodableShape {
        /// Information about the listeners.
        @OptionalCustomCoding<StandardArrayCoder<Listener>>
        public var listeners: [Listener]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        @inlinable
        public init(listeners: [Listener]? = nil, nextMarker: String? = nil) {
            self.listeners = listeners
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case listeners = "Listeners"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeLoadBalancerAttributesInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?

        @inlinable
        public init(loadBalancerArn: String? = nil) {
            self.loadBalancerArn = loadBalancerArn
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct DescribeLoadBalancerAttributesOutput: AWSDecodableShape {
        /// Information about the load balancer attributes.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancerAttribute>>
        public var attributes: [LoadBalancerAttribute]?

        @inlinable
        public init(attributes: [LoadBalancerAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct DescribeLoadBalancersInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the load balancers. You can specify up to 20 load balancers in a single call.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var loadBalancerArns: [String]?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The names of the load balancers.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var names: [String]?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        @inlinable
        public init(loadBalancerArns: [String]? = nil, marker: String? = nil, names: [String]? = nil, pageSize: Int? = nil) {
            self.loadBalancerArns = loadBalancerArns
            self.marker = marker
            self.names = names
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArns = "LoadBalancerArns"
            case marker = "Marker"
            case names = "Names"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeLoadBalancersOutput: AWSDecodableShape {
        /// Information about the load balancers.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancer>>
        public var loadBalancers: [LoadBalancer]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        @inlinable
        public init(loadBalancers: [LoadBalancer]? = nil, nextMarker: String? = nil) {
            self.loadBalancers = loadBalancers
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancers = "LoadBalancers"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeRulesInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?
        /// The Amazon Resource Names (ARN) of the rules.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var ruleArns: [String]?

        @inlinable
        public init(listenerArn: String? = nil, marker: String? = nil, pageSize: Int? = nil, ruleArns: [String]? = nil) {
            self.listenerArn = listenerArn
            self.marker = marker
            self.pageSize = pageSize
            self.ruleArns = ruleArns
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArn = "ListenerArn"
            case marker = "Marker"
            case pageSize = "PageSize"
            case ruleArns = "RuleArns"
        }
    }

    public struct DescribeRulesOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the rules.
        @OptionalCustomCoding<StandardArrayCoder<Rule>>
        public var rules: [Rule]?

        @inlinable
        public init(nextMarker: String? = nil, rules: [Rule]? = nil) {
            self.nextMarker = nextMarker
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case rules = "Rules"
        }
    }

    public struct DescribeSSLPoliciesInput: AWSEncodableShape {
        ///  The type of load balancer. The default lists the SSL policies for all load balancers.
        public let loadBalancerType: LoadBalancerTypeEnum?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The names of the policies.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var names: [String]?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        @inlinable
        public init(loadBalancerType: LoadBalancerTypeEnum? = nil, marker: String? = nil, names: [String]? = nil, pageSize: Int? = nil) {
            self.loadBalancerType = loadBalancerType
            self.marker = marker
            self.names = names
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerType = "LoadBalancerType"
            case marker = "Marker"
            case names = "Names"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeSSLPoliciesOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the security policies.
        @OptionalCustomCoding<StandardArrayCoder<SslPolicy>>
        public var sslPolicies: [SslPolicy]?

        @inlinable
        public init(nextMarker: String? = nil, sslPolicies: [SslPolicy]? = nil) {
            self.nextMarker = nextMarker
            self.sslPolicies = sslPolicies
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case sslPolicies = "SslPolicies"
        }
    }

    public struct DescribeTagsInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the resources. You can specify up to 20 resources in a single call.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var resourceArns: [String]?

        @inlinable
        public init(resourceArns: [String]? = nil) {
            self.resourceArns = resourceArns
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArns = "ResourceArns"
        }
    }

    public struct DescribeTagsOutput: AWSDecodableShape {
        /// Information about the tags.
        @OptionalCustomCoding<StandardArrayCoder<TagDescription>>
        public var tagDescriptions: [TagDescription]?

        @inlinable
        public init(tagDescriptions: [TagDescription]? = nil) {
            self.tagDescriptions = tagDescriptions
        }

        private enum CodingKeys: String, CodingKey {
            case tagDescriptions = "TagDescriptions"
        }
    }

    public struct DescribeTargetGroupAttributesInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?

        @inlinable
        public init(targetGroupArn: String? = nil) {
            self.targetGroupArn = targetGroupArn
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
        }
    }

    public struct DescribeTargetGroupAttributesOutput: AWSDecodableShape {
        /// Information about the target group attributes
        @OptionalCustomCoding<StandardArrayCoder<TargetGroupAttribute>>
        public var attributes: [TargetGroupAttribute]?

        @inlinable
        public init(attributes: [TargetGroupAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct DescribeTargetGroupsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The names of the target groups.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var names: [String]?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?
        /// The Amazon Resource Names (ARN) of the target groups.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var targetGroupArns: [String]?

        @inlinable
        public init(loadBalancerArn: String? = nil, marker: String? = nil, names: [String]? = nil, pageSize: Int? = nil, targetGroupArns: [String]? = nil) {
            self.loadBalancerArn = loadBalancerArn
            self.marker = marker
            self.names = names
            self.pageSize = pageSize
            self.targetGroupArns = targetGroupArns
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
            case marker = "Marker"
            case names = "Names"
            case pageSize = "PageSize"
            case targetGroupArns = "TargetGroupArns"
        }
    }

    public struct DescribeTargetGroupsOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the target groups.
        @OptionalCustomCoding<StandardArrayCoder<TargetGroup>>
        public var targetGroups: [TargetGroup]?

        @inlinable
        public init(nextMarker: String? = nil, targetGroups: [TargetGroup]? = nil) {
            self.nextMarker = nextMarker
            self.targetGroups = targetGroups
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case targetGroups = "TargetGroups"
        }
    }

    public struct DescribeTargetHealthInput: AWSEncodableShape {
        /// Used to include anomaly detection information.
        @OptionalCustomCoding<StandardArrayCoder<DescribeTargetHealthInputIncludeEnum>>
        public var include: [DescribeTargetHealthInputIncludeEnum]?
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The targets.
        @OptionalCustomCoding<StandardArrayCoder<TargetDescription>>
        public var targets: [TargetDescription]?

        @inlinable
        public init(include: [DescribeTargetHealthInputIncludeEnum]? = nil, targetGroupArn: String? = nil, targets: [TargetDescription]? = nil) {
            self.include = include
            self.targetGroupArn = targetGroupArn
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case include = "Include"
            case targetGroupArn = "TargetGroupArn"
            case targets = "Targets"
        }
    }

    public struct DescribeTargetHealthOutput: AWSDecodableShape {
        /// Information about the health of the targets.
        @OptionalCustomCoding<StandardArrayCoder<TargetHealthDescription>>
        public var targetHealthDescriptions: [TargetHealthDescription]?

        @inlinable
        public init(targetHealthDescriptions: [TargetHealthDescription]? = nil) {
            self.targetHealthDescriptions = targetHealthDescriptions
        }

        private enum CodingKeys: String, CodingKey {
            case targetHealthDescriptions = "TargetHealthDescriptions"
        }
    }

    public struct DescribeTrustStoreAssociationsInput: AWSEncodableShape {
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(marker: String? = nil, pageSize: Int? = nil, trustStoreArn: String? = nil) {
            self.marker = marker
            self.pageSize = pageSize
            self.trustStoreArn = trustStoreArn
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case pageSize = "PageSize"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct DescribeTrustStoreAssociationsOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the resources the trust store is associated to.
        @OptionalCustomCoding<StandardArrayCoder<TrustStoreAssociation>>
        public var trustStoreAssociations: [TrustStoreAssociation]?

        @inlinable
        public init(nextMarker: String? = nil, trustStoreAssociations: [TrustStoreAssociation]? = nil) {
            self.nextMarker = nextMarker
            self.trustStoreAssociations = trustStoreAssociations
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case trustStoreAssociations = "TrustStoreAssociations"
        }
    }

    public struct DescribeTrustStoreRevocation: AWSDecodableShape {
        /// The number of revoked certificates.
        public let numberOfRevokedEntries: Int64?
        /// The revocation ID of a revocation file in use.
        public let revocationId: Int64?
        /// The type of revocation file.
        public let revocationType: RevocationType?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(numberOfRevokedEntries: Int64? = nil, revocationId: Int64? = nil, revocationType: RevocationType? = nil, trustStoreArn: String? = nil) {
            self.numberOfRevokedEntries = numberOfRevokedEntries
            self.revocationId = revocationId
            self.revocationType = revocationType
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case numberOfRevokedEntries = "NumberOfRevokedEntries"
            case revocationId = "RevocationId"
            case revocationType = "RevocationType"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct DescribeTrustStoreRevocationsInput: AWSEncodableShape {
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?
        /// The revocation IDs of the revocation files you want to describe.
        @OptionalCustomCoding<StandardArrayCoder<Int64>>
        public var revocationIds: [Int64]?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(marker: String? = nil, pageSize: Int? = nil, revocationIds: [Int64]? = nil, trustStoreArn: String? = nil) {
            self.marker = marker
            self.pageSize = pageSize
            self.revocationIds = revocationIds
            self.trustStoreArn = trustStoreArn
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case pageSize = "PageSize"
            case revocationIds = "RevocationIds"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct DescribeTrustStoreRevocationsOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the revocation file in the trust store.
        @OptionalCustomCoding<StandardArrayCoder<DescribeTrustStoreRevocation>>
        public var trustStoreRevocations: [DescribeTrustStoreRevocation]?

        @inlinable
        public init(nextMarker: String? = nil, trustStoreRevocations: [DescribeTrustStoreRevocation]? = nil) {
            self.nextMarker = nextMarker
            self.trustStoreRevocations = trustStoreRevocations
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case trustStoreRevocations = "TrustStoreRevocations"
        }
    }

    public struct DescribeTrustStoresInput: AWSEncodableShape {
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The names of the trust stores.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var names: [String]?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?
        /// The Amazon Resource Name (ARN) of the trust store.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var trustStoreArns: [String]?

        @inlinable
        public init(marker: String? = nil, names: [String]? = nil, pageSize: Int? = nil, trustStoreArns: [String]? = nil) {
            self.marker = marker
            self.names = names
            self.pageSize = pageSize
            self.trustStoreArns = trustStoreArns
        }

        public func validate(name: String) throws {
            try self.names?.forEach {
                try validate($0, name: "names[]", parent: name, max: 32)
                try validate($0, name: "names[]", parent: name, min: 1)
                try validate($0, name: "names[]", parent: name, pattern: "^([a-zA-Z0-9]+-)*[a-zA-Z0-9]+$")
            }
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case names = "Names"
            case pageSize = "PageSize"
            case trustStoreArns = "TrustStoreArns"
        }
    }

    public struct DescribeTrustStoresOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the trust stores.
        @OptionalCustomCoding<StandardArrayCoder<TrustStore>>
        public var trustStores: [TrustStore]?

        @inlinable
        public init(nextMarker: String? = nil, trustStores: [TrustStore]? = nil) {
            self.nextMarker = nextMarker
            self.trustStores = trustStores
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case trustStores = "TrustStores"
        }
    }

    public struct FixedResponseActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The content type. Valid Values: text/plain | text/css | text/html | application/javascript | application/json
        public let contentType: String?
        /// The message.
        public let messageBody: String?
        /// The HTTP response code (2XX, 4XX, or 5XX).
        public let statusCode: String?

        @inlinable
        public init(contentType: String? = nil, messageBody: String? = nil, statusCode: String? = nil) {
            self.contentType = contentType
            self.messageBody = messageBody
            self.statusCode = statusCode
        }

        public func validate(name: String) throws {
            try self.validate(self.contentType, name: "contentType", parent: name, max: 32)
            try self.validate(self.messageBody, name: "messageBody", parent: name, max: 1024)
            try self.validate(self.statusCode, name: "statusCode", parent: name, pattern: "^(2|4|5)\\d\\d$")
        }

        private enum CodingKeys: String, CodingKey {
            case contentType = "ContentType"
            case messageBody = "MessageBody"
            case statusCode = "StatusCode"
        }
    }

    public struct ForwardActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The target groups. For Network Load Balancers, you can specify a single target group.
        @OptionalCustomCoding<StandardArrayCoder<TargetGroupTuple>>
        public var targetGroups: [TargetGroupTuple]?
        /// The target group stickiness for the rule.
        public let targetGroupStickinessConfig: TargetGroupStickinessConfig?

        @inlinable
        public init(targetGroups: [TargetGroupTuple]? = nil, targetGroupStickinessConfig: TargetGroupStickinessConfig? = nil) {
            self.targetGroups = targetGroups
            self.targetGroupStickinessConfig = targetGroupStickinessConfig
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroups = "TargetGroups"
            case targetGroupStickinessConfig = "TargetGroupStickinessConfig"
        }
    }

    public struct GetResourcePolicyInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        public let resourceArn: String?

        @inlinable
        public init(resourceArn: String? = nil) {
            self.resourceArn = resourceArn
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
        }
    }

    public struct GetResourcePolicyOutput: AWSDecodableShape {
        /// The content of the resource policy.
        public let policy: String?

        @inlinable
        public init(policy: String? = nil) {
            self.policy = policy
        }

        private enum CodingKeys: String, CodingKey {
            case policy = "Policy"
        }
    }

    public struct GetTrustStoreCaCertificatesBundleInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(trustStoreArn: String? = nil) {
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct GetTrustStoreCaCertificatesBundleOutput: AWSDecodableShape {
        /// The ca certificate bundles Amazon S3 URI.
        public let location: String?

        @inlinable
        public init(location: String? = nil) {
            self.location = location
        }

        private enum CodingKeys: String, CodingKey {
            case location = "Location"
        }
    }

    public struct GetTrustStoreRevocationContentInput: AWSEncodableShape {
        /// The revocation ID of the revocation file.
        public let revocationId: Int64?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(revocationId: Int64? = nil, trustStoreArn: String? = nil) {
            self.revocationId = revocationId
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case revocationId = "RevocationId"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct GetTrustStoreRevocationContentOutput: AWSDecodableShape {
        /// The revocation files Amazon S3 URI.
        public let location: String?

        @inlinable
        public init(location: String? = nil) {
            self.location = location
        }

        private enum CodingKeys: String, CodingKey {
            case location = "Location"
        }
    }

    public struct HostHeaderConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The regular expressions to compare against the host header. The maximum length of each string is 128 characters.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var regexValues: [String]?
        /// The host names. The maximum length of each string is 128 characters. The comparison is case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). You must include at least one "."  character. You can include only alphabetical characters after the final "." character. If you specify multiple strings, the condition is satisfied if one of the strings matches the host name.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(regexValues: [String]? = nil, values: [String]? = nil) {
            self.regexValues = regexValues
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case regexValues = "RegexValues"
            case values = "Values"
        }
    }

    public struct HostHeaderRewriteConfig: AWSEncodableShape & AWSDecodableShape {
        /// The host header rewrite transform. Each transform consists of a regular expression to match and a replacement string.
        @OptionalCustomCoding<StandardArrayCoder<RewriteConfig>>
        public var rewrites: [RewriteConfig]?

        @inlinable
        public init(rewrites: [RewriteConfig]? = nil) {
            self.rewrites = rewrites
        }

        private enum CodingKeys: String, CodingKey {
            case rewrites = "Rewrites"
        }
    }

    public struct HttpHeaderConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The name of the HTTP header field. The maximum length is 40 characters. The header name is case insensitive. The allowed characters are specified by RFC 7230. Wildcards are not supported. You can't use an HTTP header condition to specify the host header. Instead, use a host condition.
        public let httpHeaderName: String?
        /// The regular expression to compare against the HTTP header. The maximum length of each string is 128 characters.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var regexValues: [String]?
        /// The strings to compare against the value of the HTTP header. The maximum length of each string is 128 characters. The comparison strings are case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). If the same header appears multiple times in the request, we search them in order until a match is found. If you specify multiple strings, the condition is satisfied if one of the strings matches the value of the HTTP header. To require that all of the strings are a match, create one condition per string.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(httpHeaderName: String? = nil, regexValues: [String]? = nil, values: [String]? = nil) {
            self.httpHeaderName = httpHeaderName
            self.regexValues = regexValues
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case httpHeaderName = "HttpHeaderName"
            case regexValues = "RegexValues"
            case values = "Values"
        }
    }

    public struct HttpRequestMethodConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The name of the request method. The maximum length is 40 characters. The allowed characters are A-Z, hyphen (-), and underscore (_). The comparison is case sensitive. Wildcards are not supported; therefore, the method name must be an exact match. If you specify multiple strings, the condition is satisfied if one of the strings matches the HTTP request method. We recommend that you route GET and HEAD requests in the same way, because the response to a HEAD request may be cached.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(values: [String]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct IpamPools: AWSEncodableShape & AWSDecodableShape {
        /// The ID of the IPv4 IPAM pool.
        public let ipv4IpamPoolId: String?

        @inlinable
        public init(ipv4IpamPoolId: String? = nil) {
            self.ipv4IpamPoolId = ipv4IpamPoolId
        }

        public func validate(name: String) throws {
            try self.validate(self.ipv4IpamPoolId, name: "ipv4IpamPoolId", parent: name, max: 1000)
            try self.validate(self.ipv4IpamPoolId, name: "ipv4IpamPoolId", parent: name, pattern: "^(ipam-pool-)[a-zA-Z0-9]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case ipv4IpamPoolId = "Ipv4IpamPoolId"
        }
    }

    public struct Limit: AWSDecodableShape {
        /// The maximum value of the limit.
        public let max: String?
        /// The name of the limit.
        public let name: String?

        @inlinable
        public init(max: String? = nil, name: String? = nil) {
            self.max = max
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case name = "Name"
        }
    }

    public struct Listener: AWSDecodableShape {
        /// [TLS listener] The name of the Application-Layer Protocol Negotiation (ALPN) policy.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var alpnPolicy: [String]?
        /// [HTTPS or TLS listener] The default certificate for the listener.
        @OptionalCustomCoding<StandardArrayCoder<Certificate>>
        public var certificates: [Certificate]?
        /// The default actions for the listener.
        @OptionalCustomCoding<StandardArrayCoder<Action>>
        public var defaultActions: [Action]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The mutual authentication configuration information.
        public let mutualAuthentication: MutualAuthenticationAttributes?
        /// The port on which the load balancer is listening.
        public let port: Int?
        /// The protocol for connections from clients to the load balancer.
        public let `protocol`: ProtocolEnum?
        /// [HTTPS or TLS listener] The security policy that defines which protocols and ciphers are supported.
        public let sslPolicy: String?

        @inlinable
        public init(alpnPolicy: [String]? = nil, certificates: [Certificate]? = nil, defaultActions: [Action]? = nil, listenerArn: String? = nil, loadBalancerArn: String? = nil, mutualAuthentication: MutualAuthenticationAttributes? = nil, port: Int? = nil, protocol: ProtocolEnum? = nil, sslPolicy: String? = nil) {
            self.alpnPolicy = alpnPolicy
            self.certificates = certificates
            self.defaultActions = defaultActions
            self.listenerArn = listenerArn
            self.loadBalancerArn = loadBalancerArn
            self.mutualAuthentication = mutualAuthentication
            self.port = port
            self.`protocol` = `protocol`
            self.sslPolicy = sslPolicy
        }

        private enum CodingKeys: String, CodingKey {
            case alpnPolicy = "AlpnPolicy"
            case certificates = "Certificates"
            case defaultActions = "DefaultActions"
            case listenerArn = "ListenerArn"
            case loadBalancerArn = "LoadBalancerArn"
            case mutualAuthentication = "MutualAuthentication"
            case port = "Port"
            case `protocol` = "Protocol"
            case sslPolicy = "SslPolicy"
        }
    }

    public struct ListenerAttribute: AWSEncodableShape & AWSDecodableShape {
        /// The name of the attribute. The following attribute is supported by Network Load Balancers, and Gateway Load Balancers.    tcp.idle_timeout.seconds - The tcp idle timeout value, in seconds. The  valid range is 60-6000 seconds. The default is 350 seconds.   The following attributes are only supported by Application Load Balancers.    routing.http.request.x_amzn_mtls_clientcert_serial_number.header_name -  Enables you to modify the header name of the   X-Amzn-Mtls-Clientcert-Serial-Number HTTP request header.    routing.http.request.x_amzn_mtls_clientcert_issuer.header_name -  Enables you to modify the header name of the   X-Amzn-Mtls-Clientcert-Issuer HTTP request header.    routing.http.request.x_amzn_mtls_clientcert_subject.header_name -  Enables you to modify the header name of the   X-Amzn-Mtls-Clientcert-Subject HTTP request header.    routing.http.request.x_amzn_mtls_clientcert_validity.header_name -  Enables you to modify the header name of the   X-Amzn-Mtls-Clientcert-Validity HTTP request header.    routing.http.request.x_amzn_mtls_clientcert_leaf.header_name -  Enables you to modify the header name of the   X-Amzn-Mtls-Clientcert-Leaf HTTP request header.    routing.http.request.x_amzn_mtls_clientcert.header_name -  Enables you to modify the header name of the   X-Amzn-Mtls-Clientcert HTTP request header.    routing.http.request.x_amzn_tls_version.header_name -  Enables you to modify the header name of the   X-Amzn-Tls-Version HTTP request header.    routing.http.request.x_amzn_tls_cipher_suite.header_name -  Enables you to modify the header name of the   X-Amzn-Tls-Cipher-Suite HTTP request header.    routing.http.response.server.enabled -  Enables you to allow or remove the HTTP response server header.    routing.http.response.strict_transport_security.header_value -  Informs browsers that the site should only be accessed using HTTPS, and that  any future attempts to access it using HTTP should automatically be converted  to HTTPS.    routing.http.response.access_control_allow_origin.header_value -  Specifies which origins are allowed to access the server.    routing.http.response.access_control_allow_methods.header_value -  Returns which HTTP methods are allowed when accessing the server from a different  origin.    routing.http.response.access_control_allow_headers.header_value -  Specifies which headers can be used during the request.    routing.http.response.access_control_allow_credentials.header_value -  Indicates whether the browser should include credentials such as cookies or  authentication when making requests.    routing.http.response.access_control_expose_headers.header_value -  Returns which headers the browser can expose to the requesting client.    routing.http.response.access_control_max_age.header_value -  Specifies how long the results of a preflight request can be cached, in seconds.    routing.http.response.content_security_policy.header_value -  Specifies restrictions enforced by the browser to help minimize the risk of certain  types of security threats.    routing.http.response.x_content_type_options.header_value -  Indicates whether the MIME types advertised in the Content-Type  headers should be followed and not be changed.    routing.http.response.x_frame_options.header_value - Indicates  whether the browser is allowed to render a page in a frame,  iframe, embed or  object.
        public let key: String?
        /// The value of the attribute.
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 256)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[a-zA-Z0-9._]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct LoadBalancer: AWSDecodableShape {
        /// The subnets for the load balancer.
        @OptionalCustomCoding<StandardArrayCoder<AvailabilityZone>>
        public var availabilityZones: [AvailabilityZone]?
        /// The ID of the Amazon Route 53 hosted zone associated with the load balancer.
        public let canonicalHostedZoneId: String?
        /// The date and time the load balancer was created.
        public let createdTime: Date?
        /// [Application Load Balancers on Outposts] The ID of the customer-owned address pool.
        public let customerOwnedIpv4Pool: String?
        /// The public DNS name of the load balancer.
        public let dnsName: String?
        /// [Network Load Balancers with UDP listeners] Indicates whether to use an IPv6 prefix  from each subnet for source NAT. The IP address type must be dualstack. The default value is off.
        public let enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum?
        /// Indicates whether to evaluate inbound security group rules for traffic sent to a  Network Load Balancer through Amazon Web Services PrivateLink.
        public let enforceSecurityGroupInboundRulesOnPrivateLinkTraffic: String?
        /// The type of IP addresses used for public or private connections by the subnets  attached to your load balancer. [Application Load Balancers] The possible values are ipv4 (IPv4 addresses),  dualstack (IPv4 and IPv6 addresses), and dualstack-without-public-ipv4  (public IPv6 addresses and private IPv4 and IPv6 addresses). [Network Load Balancers and Gateway Load Balancers] The possible values are ipv4  (IPv4 addresses) and dualstack (IPv4 and IPv6 addresses).
        public let ipAddressType: IpAddressType?
        /// [Application Load Balancers] The IPAM pool in use by the load balancer, if configured.
        public let ipamPools: IpamPools?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The name of the load balancer.
        public let loadBalancerName: String?
        /// The nodes of an Internet-facing load balancer have public IP addresses. The DNS name of an Internet-facing load balancer is publicly resolvable to the public IP addresses of the nodes. Therefore, Internet-facing load balancers can route requests from clients over the internet. The nodes of an internal load balancer have only private IP addresses. The DNS name of an internal load balancer is publicly resolvable to the private IP addresses of the nodes. Therefore, internal load balancers can route requests only from clients with access to the VPC for the load balancer.
        public let scheme: LoadBalancerSchemeEnum?
        /// The IDs of the security groups for the load balancer.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var securityGroups: [String]?
        /// The state of the load balancer.
        public let state: LoadBalancerState?
        /// The type of load balancer.
        public let type: LoadBalancerTypeEnum?
        /// The ID of the VPC for the load balancer.
        public let vpcId: String?

        @inlinable
        public init(availabilityZones: [AvailabilityZone]? = nil, canonicalHostedZoneId: String? = nil, createdTime: Date? = nil, customerOwnedIpv4Pool: String? = nil, dnsName: String? = nil, enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum? = nil, enforceSecurityGroupInboundRulesOnPrivateLinkTraffic: String? = nil, ipAddressType: IpAddressType? = nil, ipamPools: IpamPools? = nil, loadBalancerArn: String? = nil, loadBalancerName: String? = nil, scheme: LoadBalancerSchemeEnum? = nil, securityGroups: [String]? = nil, state: LoadBalancerState? = nil, type: LoadBalancerTypeEnum? = nil, vpcId: String? = nil) {
            self.availabilityZones = availabilityZones
            self.canonicalHostedZoneId = canonicalHostedZoneId
            self.createdTime = createdTime
            self.customerOwnedIpv4Pool = customerOwnedIpv4Pool
            self.dnsName = dnsName
            self.enablePrefixForIpv6SourceNat = enablePrefixForIpv6SourceNat
            self.enforceSecurityGroupInboundRulesOnPrivateLinkTraffic = enforceSecurityGroupInboundRulesOnPrivateLinkTraffic
            self.ipAddressType = ipAddressType
            self.ipamPools = ipamPools
            self.loadBalancerArn = loadBalancerArn
            self.loadBalancerName = loadBalancerName
            self.scheme = scheme
            self.securityGroups = securityGroups
            self.state = state
            self.type = type
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case canonicalHostedZoneId = "CanonicalHostedZoneId"
            case createdTime = "CreatedTime"
            case customerOwnedIpv4Pool = "CustomerOwnedIpv4Pool"
            case dnsName = "DNSName"
            case enablePrefixForIpv6SourceNat = "EnablePrefixForIpv6SourceNat"
            case enforceSecurityGroupInboundRulesOnPrivateLinkTraffic = "EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic"
            case ipAddressType = "IpAddressType"
            case ipamPools = "IpamPools"
            case loadBalancerArn = "LoadBalancerArn"
            case loadBalancerName = "LoadBalancerName"
            case scheme = "Scheme"
            case securityGroups = "SecurityGroups"
            case state = "State"
            case type = "Type"
            case vpcId = "VpcId"
        }
    }

    public struct LoadBalancerAddress: AWSDecodableShape {
        /// [Network Load Balancers] The allocation ID of the Elastic IP address for an internal-facing load balancer.
        public let allocationId: String?
        /// The static IP address.
        public let ipAddress: String?
        /// [Network Load Balancers] The IPv6 address.
        public let iPv6Address: String?
        /// [Network Load Balancers] The private IPv4 address for an internal load balancer.
        public let privateIPv4Address: String?

        @inlinable
        public init(allocationId: String? = nil, ipAddress: String? = nil, iPv6Address: String? = nil, privateIPv4Address: String? = nil) {
            self.allocationId = allocationId
            self.ipAddress = ipAddress
            self.iPv6Address = iPv6Address
            self.privateIPv4Address = privateIPv4Address
        }

        private enum CodingKeys: String, CodingKey {
            case allocationId = "AllocationId"
            case ipAddress = "IpAddress"
            case iPv6Address = "IPv6Address"
            case privateIPv4Address = "PrivateIPv4Address"
        }
    }

    public struct LoadBalancerAttribute: AWSEncodableShape & AWSDecodableShape {
        /// The name of the attribute. The following attributes are supported by all load balancers:    deletion_protection.enabled - Indicates whether deletion protection is enabled. The value is true or false. The default is false.    load_balancing.cross_zone.enabled - Indicates whether cross-zone load balancing is enabled. The possible values are true and false. The default for Network Load Balancers and Gateway Load Balancers is false.  The default for Application Load Balancers is true, and can't be changed.   The following attributes are supported by both Application Load Balancers and Network Load Balancers:    access_logs.s3.enabled - Indicates whether access logs are enabled. The value is true or false. The default is false.    access_logs.s3.bucket - The name of the S3 bucket for the access logs. This attribute is required if access logs are enabled. The bucket must exist in the same region as the load balancer and have a bucket policy that grants Elastic Load Balancing permissions to write to the bucket.    access_logs.s3.prefix - The prefix for the location in the S3 bucket for the access logs.    ipv6.deny_all_igw_traffic - Blocks internet gateway (IGW) access to the load balancer. It is set to false for internet-facing load balancers and true for internal load balancers, preventing unintended access to your internal load balancer through an internet gateway.    zonal_shift.config.enabled - Indicates whether zonal shift is  enabled. The possible values are true and false. The  default is false.   The following attributes are supported by only Application Load Balancers:    idle_timeout.timeout_seconds - The idle timeout value, in seconds. The valid range is 1-4000 seconds. The default is 60 seconds.    client_keep_alive.seconds - The client keep alive value, in seconds. The  valid range is 60-604800 seconds. The default is 3600 seconds.    connection_logs.s3.enabled - Indicates whether connection logs are enabled. The value is true or false. The default is false.    connection_logs.s3.bucket - The name of the S3 bucket for the connection logs. This attribute is required if connection logs are enabled. The bucket must exist in the same region as the load balancer and have a bucket policy that grants Elastic Load Balancing permissions to write to the bucket.    connection_logs.s3.prefix - The prefix for the location in the S3 bucket for the connection logs.    routing.http.desync_mitigation_mode - Determines how the load balancer handles requests that might pose a security risk to your application. The possible values are monitor, defensive, and strictest. The default is defensive.    routing.http.drop_invalid_header_fields.enabled - Indicates whether HTTP headers with invalid header fields are removed by the load balancer (true) or routed to targets (false). The default is false.    routing.http.preserve_host_header.enabled - Indicates whether the Application Load Balancer should preserve the Host header in the HTTP request and send it to the target without any change. The possible values are true and false. The default is false.    routing.http.x_amzn_tls_version_and_cipher_suite.enabled - Indicates whether the two headers (x-amzn-tls-version and x-amzn-tls-cipher-suite), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target. The x-amzn-tls-version header has information about the TLS protocol version negotiated with the client, and the x-amzn-tls-cipher-suite header has information about the cipher suite negotiated with the client. Both headers are in OpenSSL format. The possible values for the attribute are true and false. The default is false.    routing.http.xff_client_port.enabled - Indicates whether the X-Forwarded-For header should preserve the source port that the client used to connect to the load balancer. The possible values are true and false. The default is false.    routing.http.xff_header_processing.mode - Enables you to modify, preserve, or remove the X-Forwarded-For header in the HTTP request before the Application Load Balancer sends the request to the target. The possible values are append, preserve, and remove. The default is append.   If the value is append, the Application Load Balancer adds the client IP address (of the last hop) to the X-Forwarded-For header in the HTTP request before it sends it to targets.   If the value is preserve the Application Load Balancer preserves the X-Forwarded-For header in the HTTP request, and sends it to targets without any change.   If the value is remove, the Application Load Balancer removes the X-Forwarded-For header in the HTTP request before it sends it to targets.      routing.http2.enabled - Indicates whether clients can connect to the load balancer using HTTP/2. If true, clients can connect using HTTP/2 or HTTP/1.1. However, all client requests are subject to the stricter HTTP/2 header validation rules. For example, message header names must contain only alphanumeric characters and hyphens. If false, clients must connect using HTTP/1.1. The default is true.    waf.fail_open.enabled - Indicates whether to allow a WAF-enabled load balancer to route requests to targets if it is unable to forward the request to Amazon Web Services WAF. The possible values are true and false. The default is false.   The following attributes are supported by only Network Load Balancers:    dns_record.client_routing_policy - Indicates how traffic is  distributed among the load balancer Availability Zones. The possible values are  availability_zone_affinity with 100 percent zonal affinity,  partial_availability_zone_affinity with 85 percent zonal affinity,  and any_availability_zone with 0 percent zonal affinity.    secondary_ips.auto_assigned.per_subnet - The number of secondary IP addresses to configure for your load balancer nodes. Use to address port  allocation errors if you can't add targets. The valid range is 0 to 7. The  default is 0. After you set this value, you can't decrease it.
        public let key: String?
        /// The value of the attribute.
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 256)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[a-zA-Z0-9._]+$")
            try self.validate(self.value, name: "value", parent: name, max: 1024)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct LoadBalancerState: AWSDecodableShape {
        /// The state code. The initial state of the load balancer is provisioning. After the load balancer is fully set up and ready to route traffic, its state is active. If load balancer is routing traffic but does not have the resources it needs to scale, its state isactive_impaired. If the load balancer could not be set up, its state is failed.
        public let code: LoadBalancerStateEnum?
        /// A description of the state.
        public let reason: String?

        @inlinable
        public init(code: LoadBalancerStateEnum? = nil, reason: String? = nil) {
            self.code = code
            self.reason = reason
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case reason = "Reason"
        }
    }

    public struct Matcher: AWSEncodableShape & AWSDecodableShape {
        /// You can specify values between 0 and 99. You can specify multiple values (for example, "0,1") or a range of values (for example, "0-5"). The default value is 12.
        public let grpcCode: String?
        /// For Application Load Balancers, you can specify values between 200 and 499, with the default value being 200. You can specify multiple values (for example, "200,202") or a range of values (for example, "200-299"). For Network Load Balancers, you can specify values between 200 and 599, with the default value being 200-399. You can specify multiple values (for example, "200,202") or a range of values (for example, "200-299"). For Gateway Load Balancers, this must be "200–399". Note that when using shorthand syntax, some values such as commas need to be escaped.
        public let httpCode: String?

        @inlinable
        public init(grpcCode: String? = nil, httpCode: String? = nil) {
            self.grpcCode = grpcCode
            self.httpCode = httpCode
        }

        private enum CodingKeys: String, CodingKey {
            case grpcCode = "GrpcCode"
            case httpCode = "HttpCode"
        }
    }

    public struct MinimumLoadBalancerCapacity: AWSEncodableShape & AWSDecodableShape {
        /// The number of capacity units.
        public let capacityUnits: Int?

        @inlinable
        public init(capacityUnits: Int? = nil) {
            self.capacityUnits = capacityUnits
        }

        private enum CodingKeys: String, CodingKey {
            case capacityUnits = "CapacityUnits"
        }
    }

    public struct ModifyCapacityReservationInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The minimum load balancer capacity reserved.
        public let minimumLoadBalancerCapacity: MinimumLoadBalancerCapacity?
        /// Resets the capacity reservation.
        public let resetCapacityReservation: Bool?

        @inlinable
        public init(loadBalancerArn: String? = nil, minimumLoadBalancerCapacity: MinimumLoadBalancerCapacity? = nil, resetCapacityReservation: Bool? = nil) {
            self.loadBalancerArn = loadBalancerArn
            self.minimumLoadBalancerCapacity = minimumLoadBalancerCapacity
            self.resetCapacityReservation = resetCapacityReservation
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
            case minimumLoadBalancerCapacity = "MinimumLoadBalancerCapacity"
            case resetCapacityReservation = "ResetCapacityReservation"
        }
    }

    public struct ModifyCapacityReservationOutput: AWSDecodableShape {
        /// The state of the capacity reservation.
        @OptionalCustomCoding<StandardArrayCoder<ZonalCapacityReservationState>>
        public var capacityReservationState: [ZonalCapacityReservationState]?
        /// The amount of daily capacity decreases remaining.
        public let decreaseRequestsRemaining: Int?
        /// The last time the capacity reservation was modified.
        public let lastModifiedTime: Date?
        /// The requested minimum capacity reservation for the load balancer
        public let minimumLoadBalancerCapacity: MinimumLoadBalancerCapacity?

        @inlinable
        public init(capacityReservationState: [ZonalCapacityReservationState]? = nil, decreaseRequestsRemaining: Int? = nil, lastModifiedTime: Date? = nil, minimumLoadBalancerCapacity: MinimumLoadBalancerCapacity? = nil) {
            self.capacityReservationState = capacityReservationState
            self.decreaseRequestsRemaining = decreaseRequestsRemaining
            self.lastModifiedTime = lastModifiedTime
            self.minimumLoadBalancerCapacity = minimumLoadBalancerCapacity
        }

        private enum CodingKeys: String, CodingKey {
            case capacityReservationState = "CapacityReservationState"
            case decreaseRequestsRemaining = "DecreaseRequestsRemaining"
            case lastModifiedTime = "LastModifiedTime"
            case minimumLoadBalancerCapacity = "MinimumLoadBalancerCapacity"
        }
    }

    public struct ModifyIpPoolsInput: AWSEncodableShape {
        /// The IPAM pools to be modified.
        public let ipamPools: IpamPools?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// Remove the IP pools in use by the load balancer.
        @OptionalCustomCoding<StandardArrayCoder<RemoveIpamPoolEnum>>
        public var removeIpamPools: [RemoveIpamPoolEnum]?

        @inlinable
        public init(ipamPools: IpamPools? = nil, loadBalancerArn: String? = nil, removeIpamPools: [RemoveIpamPoolEnum]? = nil) {
            self.ipamPools = ipamPools
            self.loadBalancerArn = loadBalancerArn
            self.removeIpamPools = removeIpamPools
        }

        public func validate(name: String) throws {
            try self.ipamPools?.validate(name: "\(name).ipamPools")
        }

        private enum CodingKeys: String, CodingKey {
            case ipamPools = "IpamPools"
            case loadBalancerArn = "LoadBalancerArn"
            case removeIpamPools = "RemoveIpamPools"
        }
    }

    public struct ModifyIpPoolsOutput: AWSDecodableShape {
        /// The IPAM pool ID.
        public let ipamPools: IpamPools?

        @inlinable
        public init(ipamPools: IpamPools? = nil) {
            self.ipamPools = ipamPools
        }

        private enum CodingKeys: String, CodingKey {
            case ipamPools = "IpamPools"
        }
    }

    public struct ModifyListenerAttributesInput: AWSEncodableShape {
        /// The listener attributes.
        @OptionalCustomCoding<StandardArrayCoder<ListenerAttribute>>
        public var attributes: [ListenerAttribute]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?

        @inlinable
        public init(attributes: [ListenerAttribute]? = nil, listenerArn: String? = nil) {
            self.attributes = attributes
            self.listenerArn = listenerArn
        }

        public func validate(name: String) throws {
            try self.attributes?.forEach {
                try $0.validate(name: "\(name).attributes[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case listenerArn = "ListenerArn"
        }
    }

    public struct ModifyListenerAttributesOutput: AWSDecodableShape {
        /// Information about the listener attributes.
        @OptionalCustomCoding<StandardArrayCoder<ListenerAttribute>>
        public var attributes: [ListenerAttribute]?

        @inlinable
        public init(attributes: [ListenerAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct ModifyListenerInput: AWSEncodableShape {
        /// [TLS listeners] The name of the Application-Layer Protocol Negotiation (ALPN) policy. You can specify one policy name. The following are the possible values:    HTTP1Only     HTTP2Only     HTTP2Optional     HTTP2Preferred     None    For more information, see ALPN policies in the Network Load Balancers Guide.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var alpnPolicy: [String]?
        /// [HTTPS and TLS listeners] The default certificate for the listener. You must provide exactly one certificate. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @OptionalCustomCoding<StandardArrayCoder<Certificate>>
        public var certificates: [Certificate]?
        /// The actions for the default rule.
        @OptionalCustomCoding<StandardArrayCoder<Action>>
        public var defaultActions: [Action]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?
        /// [HTTPS listeners] The mutual authentication configuration information.
        public let mutualAuthentication: MutualAuthenticationAttributes?
        /// The port for connections from clients to the load balancer. You can't specify a port for a Gateway Load Balancer.
        public let port: Int?
        /// The protocol for connections from clients to the load balancer. Application Load Balancers support the HTTP and HTTPS protocols. Network Load Balancers support the TCP, TLS, UDP, and TCP_UDP protocols. You can’t change the protocol to UDP or TCP_UDP if dual-stack mode is enabled. You can't specify a protocol for a Gateway Load Balancer.
        public let `protocol`: ProtocolEnum?
        /// [HTTPS and TLS listeners] The security policy that defines which protocols and ciphers are supported. For more information, see Security policies in the Application Load Balancers Guide or Security policies in the Network Load Balancers Guide.
        public let sslPolicy: String?

        @inlinable
        public init(alpnPolicy: [String]? = nil, certificates: [Certificate]? = nil, defaultActions: [Action]? = nil, listenerArn: String? = nil, mutualAuthentication: MutualAuthenticationAttributes? = nil, port: Int? = nil, protocol: ProtocolEnum? = nil, sslPolicy: String? = nil) {
            self.alpnPolicy = alpnPolicy
            self.certificates = certificates
            self.defaultActions = defaultActions
            self.listenerArn = listenerArn
            self.mutualAuthentication = mutualAuthentication
            self.port = port
            self.`protocol` = `protocol`
            self.sslPolicy = sslPolicy
        }

        public func validate(name: String) throws {
            try self.defaultActions?.forEach {
                try $0.validate(name: "\(name).defaultActions[]")
            }
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case alpnPolicy = "AlpnPolicy"
            case certificates = "Certificates"
            case defaultActions = "DefaultActions"
            case listenerArn = "ListenerArn"
            case mutualAuthentication = "MutualAuthentication"
            case port = "Port"
            case `protocol` = "Protocol"
            case sslPolicy = "SslPolicy"
        }
    }

    public struct ModifyListenerOutput: AWSDecodableShape {
        /// Information about the modified listener.
        @OptionalCustomCoding<StandardArrayCoder<Listener>>
        public var listeners: [Listener]?

        @inlinable
        public init(listeners: [Listener]? = nil) {
            self.listeners = listeners
        }

        private enum CodingKeys: String, CodingKey {
            case listeners = "Listeners"
        }
    }

    public struct ModifyLoadBalancerAttributesInput: AWSEncodableShape {
        /// The load balancer attributes.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancerAttribute>>
        public var attributes: [LoadBalancerAttribute]?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?

        @inlinable
        public init(attributes: [LoadBalancerAttribute]? = nil, loadBalancerArn: String? = nil) {
            self.attributes = attributes
            self.loadBalancerArn = loadBalancerArn
        }

        public func validate(name: String) throws {
            try self.attributes?.forEach {
                try $0.validate(name: "\(name).attributes[]")
            }
            try self.validate(self.attributes, name: "attributes", parent: name, max: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct ModifyLoadBalancerAttributesOutput: AWSDecodableShape {
        /// Information about the load balancer attributes.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancerAttribute>>
        public var attributes: [LoadBalancerAttribute]?

        @inlinable
        public init(attributes: [LoadBalancerAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct ModifyRuleInput: AWSEncodableShape {
        /// The actions.
        @OptionalCustomCoding<StandardArrayCoder<Action>>
        public var actions: [Action]?
        /// The conditions.
        @OptionalCustomCoding<StandardArrayCoder<RuleCondition>>
        public var conditions: [RuleCondition]?
        /// Indicates whether to remove all transforms from the rule. If you specify ResetTransforms,  you can't specify Transforms.
        public let resetTransforms: Bool?
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String?
        /// The transforms to apply to requests that match this rule. You can add one host header rewrite transform  and one URL rewrite transform. If you specify Transforms, you can't specify ResetTransforms.
        @OptionalCustomCoding<StandardArrayCoder<RuleTransform>>
        public var transforms: [RuleTransform]?

        @inlinable
        public init(actions: [Action]? = nil, conditions: [RuleCondition]? = nil, resetTransforms: Bool? = nil, ruleArn: String? = nil, transforms: [RuleTransform]? = nil) {
            self.actions = actions
            self.conditions = conditions
            self.resetTransforms = resetTransforms
            self.ruleArn = ruleArn
            self.transforms = transforms
        }

        public func validate(name: String) throws {
            try self.actions?.forEach {
                try $0.validate(name: "\(name).actions[]")
            }
            try self.conditions?.forEach {
                try $0.validate(name: "\(name).conditions[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case actions = "Actions"
            case conditions = "Conditions"
            case resetTransforms = "ResetTransforms"
            case ruleArn = "RuleArn"
            case transforms = "Transforms"
        }
    }

    public struct ModifyRuleOutput: AWSDecodableShape {
        /// Information about the modified rule.
        @OptionalCustomCoding<StandardArrayCoder<Rule>>
        public var rules: [Rule]?

        @inlinable
        public init(rules: [Rule]? = nil) {
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case rules = "Rules"
        }
    }

    public struct ModifyTargetGroupAttributesInput: AWSEncodableShape {
        /// The target group attributes.
        @OptionalCustomCoding<StandardArrayCoder<TargetGroupAttribute>>
        public var attributes: [TargetGroupAttribute]?
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?

        @inlinable
        public init(attributes: [TargetGroupAttribute]? = nil, targetGroupArn: String? = nil) {
            self.attributes = attributes
            self.targetGroupArn = targetGroupArn
        }

        public func validate(name: String) throws {
            try self.attributes?.forEach {
                try $0.validate(name: "\(name).attributes[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case targetGroupArn = "TargetGroupArn"
        }
    }

    public struct ModifyTargetGroupAttributesOutput: AWSDecodableShape {
        /// Information about the target group attributes.
        @OptionalCustomCoding<StandardArrayCoder<TargetGroupAttribute>>
        public var attributes: [TargetGroupAttribute]?

        @inlinable
        public init(attributes: [TargetGroupAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct ModifyTargetGroupInput: AWSEncodableShape {
        /// Indicates whether health checks are enabled. If the target type is lambda, health checks are disabled by default but can be enabled. If the target type is instance, ip, or alb, health checks are always enabled and can't be disabled.
        public let healthCheckEnabled: Bool?
        /// The approximate amount of time, in seconds, between health checks of an individual target.
        public let healthCheckIntervalSeconds: Int?
        /// [HTTP/HTTPS health checks] The destination for health checks on the targets. [HTTP1 or HTTP2 protocol version] The ping path. The default is /. [GRPC protocol version] The path of a custom health check method with the format /package.service/method. The default is /Amazon Web Services.ALB/healthcheck.
        public let healthCheckPath: String?
        /// The port the load balancer uses when performing health checks on targets.
        public let healthCheckPort: String?
        /// The protocol the load balancer uses when performing health checks on targets. For Application Load Balancers, the default is HTTP. For Network Load Balancers and Gateway Load Balancers, the default is TCP. The TCP protocol is not supported for health checks if the protocol of the target group is HTTP or HTTPS. It is supported for health checks only if the protocol of the target group is TCP, TLS, UDP, or TCP_UDP. The GENEVE, TLS, UDP, and TCP_UDP protocols are not supported for health checks.
        public let healthCheckProtocol: ProtocolEnum?
        /// [HTTP/HTTPS health checks] The amount of time, in seconds, during which no response means a failed health check.
        public let healthCheckTimeoutSeconds: Int?
        /// The number of consecutive health checks successes required before considering an unhealthy target healthy.
        public let healthyThresholdCount: Int?
        /// [HTTP/HTTPS health checks] The HTTP or gRPC codes to use when checking for a successful  response from a target. For target groups with a protocol of TCP, TCP_UDP, UDP or TLS the range  is 200-599. For target groups with a protocol of HTTP or HTTPS, the range is 200-499. For target  groups with a protocol of GENEVE, the range is 200-399.
        public let matcher: Matcher?
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The number of consecutive health check failures required before considering the target unhealthy.
        public let unhealthyThresholdCount: Int?

        @inlinable
        public init(healthCheckEnabled: Bool? = nil, healthCheckIntervalSeconds: Int? = nil, healthCheckPath: String? = nil, healthCheckPort: String? = nil, healthCheckProtocol: ProtocolEnum? = nil, healthCheckTimeoutSeconds: Int? = nil, healthyThresholdCount: Int? = nil, matcher: Matcher? = nil, targetGroupArn: String? = nil, unhealthyThresholdCount: Int? = nil) {
            self.healthCheckEnabled = healthCheckEnabled
            self.healthCheckIntervalSeconds = healthCheckIntervalSeconds
            self.healthCheckPath = healthCheckPath
            self.healthCheckPort = healthCheckPort
            self.healthCheckProtocol = healthCheckProtocol
            self.healthCheckTimeoutSeconds = healthCheckTimeoutSeconds
            self.healthyThresholdCount = healthyThresholdCount
            self.matcher = matcher
            self.targetGroupArn = targetGroupArn
            self.unhealthyThresholdCount = unhealthyThresholdCount
        }

        public func validate(name: String) throws {
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, max: 300)
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, min: 5)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, max: 1024)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, min: 1)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, max: 120)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, min: 2)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, max: 10)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, min: 2)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, max: 10)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, min: 2)
        }

        private enum CodingKeys: String, CodingKey {
            case healthCheckEnabled = "HealthCheckEnabled"
            case healthCheckIntervalSeconds = "HealthCheckIntervalSeconds"
            case healthCheckPath = "HealthCheckPath"
            case healthCheckPort = "HealthCheckPort"
            case healthCheckProtocol = "HealthCheckProtocol"
            case healthCheckTimeoutSeconds = "HealthCheckTimeoutSeconds"
            case healthyThresholdCount = "HealthyThresholdCount"
            case matcher = "Matcher"
            case targetGroupArn = "TargetGroupArn"
            case unhealthyThresholdCount = "UnhealthyThresholdCount"
        }
    }

    public struct ModifyTargetGroupOutput: AWSDecodableShape {
        /// Information about the modified target group.
        @OptionalCustomCoding<StandardArrayCoder<TargetGroup>>
        public var targetGroups: [TargetGroup]?

        @inlinable
        public init(targetGroups: [TargetGroup]? = nil) {
            self.targetGroups = targetGroups
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroups = "TargetGroups"
        }
    }

    public struct ModifyTrustStoreInput: AWSEncodableShape {
        /// The Amazon S3 bucket for the ca certificates bundle.
        public let caCertificatesBundleS3Bucket: String?
        /// The Amazon S3 path for the ca certificates bundle.
        public let caCertificatesBundleS3Key: String?
        /// The Amazon S3 object version for the ca certificates bundle. If undefined the current version is used.
        public let caCertificatesBundleS3ObjectVersion: String?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(caCertificatesBundleS3Bucket: String? = nil, caCertificatesBundleS3Key: String? = nil, caCertificatesBundleS3ObjectVersion: String? = nil, trustStoreArn: String? = nil) {
            self.caCertificatesBundleS3Bucket = caCertificatesBundleS3Bucket
            self.caCertificatesBundleS3Key = caCertificatesBundleS3Key
            self.caCertificatesBundleS3ObjectVersion = caCertificatesBundleS3ObjectVersion
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case caCertificatesBundleS3Bucket = "CaCertificatesBundleS3Bucket"
            case caCertificatesBundleS3Key = "CaCertificatesBundleS3Key"
            case caCertificatesBundleS3ObjectVersion = "CaCertificatesBundleS3ObjectVersion"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct ModifyTrustStoreOutput: AWSDecodableShape {
        /// Information about the modified trust store.
        @OptionalCustomCoding<StandardArrayCoder<TrustStore>>
        public var trustStores: [TrustStore]?

        @inlinable
        public init(trustStores: [TrustStore]? = nil) {
            self.trustStores = trustStores
        }

        private enum CodingKeys: String, CodingKey {
            case trustStores = "TrustStores"
        }
    }

    public struct MutualAuthenticationAttributes: AWSEncodableShape & AWSDecodableShape {
        /// Indicates whether trust store CA certificate names are advertised.
        public let advertiseTrustStoreCaNames: AdvertiseTrustStoreCaNamesEnum?
        /// Indicates whether expired client certificates are ignored.
        public let ignoreClientCertificateExpiry: Bool?
        /// The client certificate handling method. Options are off,  passthrough or verify. The default value is  off.
        public let mode: String?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?
        /// Indicates a shared trust stores association status.
        public let trustStoreAssociationStatus: TrustStoreAssociationStatusEnum?

        @inlinable
        public init(advertiseTrustStoreCaNames: AdvertiseTrustStoreCaNamesEnum? = nil, ignoreClientCertificateExpiry: Bool? = nil, mode: String? = nil, trustStoreArn: String? = nil, trustStoreAssociationStatus: TrustStoreAssociationStatusEnum? = nil) {
            self.advertiseTrustStoreCaNames = advertiseTrustStoreCaNames
            self.ignoreClientCertificateExpiry = ignoreClientCertificateExpiry
            self.mode = mode
            self.trustStoreArn = trustStoreArn
            self.trustStoreAssociationStatus = trustStoreAssociationStatus
        }

        private enum CodingKeys: String, CodingKey {
            case advertiseTrustStoreCaNames = "AdvertiseTrustStoreCaNames"
            case ignoreClientCertificateExpiry = "IgnoreClientCertificateExpiry"
            case mode = "Mode"
            case trustStoreArn = "TrustStoreArn"
            case trustStoreAssociationStatus = "TrustStoreAssociationStatus"
        }
    }

    public struct PathPatternConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The regular expressions to compare against the request URL. The maximum length of each string is 128 characters.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var regexValues: [String]?
        /// The path patterns to compare against the request URL. The maximum length of each string is 128 characters. The comparison is case sensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). If you specify multiple strings, the condition is satisfied if one of them matches the request URL. The path pattern is compared only to the path of the URL, not to its query string. To compare against the query string, use a query string condition.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(regexValues: [String]? = nil, values: [String]? = nil) {
            self.regexValues = regexValues
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case regexValues = "RegexValues"
            case values = "Values"
        }
    }

    public struct QueryStringConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The key/value pairs or values to find in the query string. The maximum length of each string is 128 characters. The comparison is case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). To search for a literal '*' or '?' character in a query string, you must escape these characters in Values using a '\' character. If you specify multiple key/value pairs or values, the condition is satisfied if one of them is found in the query string.
        @OptionalCustomCoding<StandardArrayCoder<QueryStringKeyValuePair>>
        public var values: [QueryStringKeyValuePair]?

        @inlinable
        public init(values: [QueryStringKeyValuePair]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct QueryStringKeyValuePair: AWSEncodableShape & AWSDecodableShape {
        /// The key. You can omit the key.
        public let key: String?
        /// The value.
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct RedirectActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The hostname. This component is not percent-encoded. The hostname can contain #{host}.
        public let host: String?
        /// The absolute path, starting with the leading "/". This component is not percent-encoded. The path can contain #{host}, #{path}, and #{port}.
        public let path: String?
        /// The port. You can specify a value from 1 to 65535 or #{port}.
        public let port: String?
        /// The protocol. You can specify HTTP, HTTPS, or #{protocol}. You can redirect HTTP to HTTP, HTTP to HTTPS, and HTTPS to HTTPS. You can't redirect HTTPS to HTTP.
        public let `protocol`: String?
        /// The query parameters, URL-encoded when necessary, but not percent-encoded. Do not include the leading "?", as it is automatically added. You can specify any of the reserved keywords.
        public let query: String?
        /// The HTTP redirect code. The redirect is either permanent (HTTP 301) or temporary (HTTP 302).
        public let statusCode: RedirectActionStatusCodeEnum?

        @inlinable
        public init(host: String? = nil, path: String? = nil, port: String? = nil, protocol: String? = nil, query: String? = nil, statusCode: RedirectActionStatusCodeEnum? = nil) {
            self.host = host
            self.path = path
            self.port = port
            self.`protocol` = `protocol`
            self.query = query
            self.statusCode = statusCode
        }

        public func validate(name: String) throws {
            try self.validate(self.host, name: "host", parent: name, max: 128)
            try self.validate(self.host, name: "host", parent: name, min: 1)
            try self.validate(self.path, name: "path", parent: name, max: 128)
            try self.validate(self.path, name: "path", parent: name, min: 1)
            try self.validate(self.`protocol`, name: "`protocol`", parent: name, pattern: "^(HTTPS?|#\\{protocol\\})$")
            try self.validate(self.query, name: "query", parent: name, max: 128)
        }

        private enum CodingKeys: String, CodingKey {
            case host = "Host"
            case path = "Path"
            case port = "Port"
            case `protocol` = "Protocol"
            case query = "Query"
            case statusCode = "StatusCode"
        }
    }

    public struct RegisterTargetsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The targets.
        @OptionalCustomCoding<StandardArrayCoder<TargetDescription>>
        public var targets: [TargetDescription]?

        @inlinable
        public init(targetGroupArn: String? = nil, targets: [TargetDescription]? = nil) {
            self.targetGroupArn = targetGroupArn
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
            case targets = "Targets"
        }
    }

    public struct RegisterTargetsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct RemoveListenerCertificatesInput: AWSEncodableShape {
        /// The certificate to remove. You can specify one certificate per call. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @OptionalCustomCoding<StandardArrayCoder<Certificate>>
        public var certificates: [Certificate]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?

        @inlinable
        public init(certificates: [Certificate]? = nil, listenerArn: String? = nil) {
            self.certificates = certificates
            self.listenerArn = listenerArn
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
            case listenerArn = "ListenerArn"
        }
    }

    public struct RemoveListenerCertificatesOutput: AWSDecodableShape {
        public init() {}
    }

    public struct RemoveTagsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var resourceArns: [String]?
        /// The tag keys for the tags to remove.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var tagKeys: [String]?

        @inlinable
        public init(resourceArns: [String]? = nil, tagKeys: [String]? = nil) {
            self.resourceArns = resourceArns
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.tagKeys?.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
                try validate($0, name: "tagKeys[]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArns = "ResourceArns"
            case tagKeys = "TagKeys"
        }
    }

    public struct RemoveTagsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct RemoveTrustStoreRevocationsInput: AWSEncodableShape {
        /// The revocation IDs of the revocation files you want to remove.
        @OptionalCustomCoding<StandardArrayCoder<Int64>>
        public var revocationIds: [Int64]?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(revocationIds: [Int64]? = nil, trustStoreArn: String? = nil) {
            self.revocationIds = revocationIds
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case revocationIds = "RevocationIds"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct RemoveTrustStoreRevocationsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct RevocationContent: AWSEncodableShape {
        /// The type of revocation file.
        public let revocationType: RevocationType?
        /// The Amazon S3 bucket for the revocation file.
        public let s3Bucket: String?
        /// The Amazon S3 path for the revocation file.
        public let s3Key: String?
        /// The Amazon S3 object version of the revocation file.
        public let s3ObjectVersion: String?

        @inlinable
        public init(revocationType: RevocationType? = nil, s3Bucket: String? = nil, s3Key: String? = nil, s3ObjectVersion: String? = nil) {
            self.revocationType = revocationType
            self.s3Bucket = s3Bucket
            self.s3Key = s3Key
            self.s3ObjectVersion = s3ObjectVersion
        }

        private enum CodingKeys: String, CodingKey {
            case revocationType = "RevocationType"
            case s3Bucket = "S3Bucket"
            case s3Key = "S3Key"
            case s3ObjectVersion = "S3ObjectVersion"
        }
    }

    public struct RewriteConfig: AWSEncodableShape & AWSDecodableShape {
        /// The regular expression to match in the input string. The maximum length of the string is 1,024 characters.
        public let regex: String?
        /// The replacement string to use when rewriting the matched input. The maximum length of the string is 1,024 characters.  You can specify capture groups in the regular expression (for example, $1 and $2).
        public let replace: String?

        @inlinable
        public init(regex: String? = nil, replace: String? = nil) {
            self.regex = regex
            self.replace = replace
        }

        private enum CodingKeys: String, CodingKey {
            case regex = "Regex"
            case replace = "Replace"
        }
    }

    public struct Rule: AWSDecodableShape {
        /// The actions. Each rule must include exactly one of the following types of actions: forward, redirect, or fixed-response, and it must be the last action to be performed.
        @OptionalCustomCoding<StandardArrayCoder<Action>>
        public var actions: [Action]?
        /// The conditions. Each rule can include zero or one of the following conditions: http-request-method, host-header, path-pattern, and source-ip, and zero or more of the following conditions: http-header and query-string.
        @OptionalCustomCoding<StandardArrayCoder<RuleCondition>>
        public var conditions: [RuleCondition]?
        /// Indicates whether this is the default rule.
        public let isDefault: Bool?
        /// The priority.
        public let priority: String?
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String?
        /// The transforms for the rule.
        @OptionalCustomCoding<StandardArrayCoder<RuleTransform>>
        public var transforms: [RuleTransform]?

        @inlinable
        public init(actions: [Action]? = nil, conditions: [RuleCondition]? = nil, isDefault: Bool? = nil, priority: String? = nil, ruleArn: String? = nil, transforms: [RuleTransform]? = nil) {
            self.actions = actions
            self.conditions = conditions
            self.isDefault = isDefault
            self.priority = priority
            self.ruleArn = ruleArn
            self.transforms = transforms
        }

        private enum CodingKeys: String, CodingKey {
            case actions = "Actions"
            case conditions = "Conditions"
            case isDefault = "IsDefault"
            case priority = "Priority"
            case ruleArn = "RuleArn"
            case transforms = "Transforms"
        }
    }

    public struct RuleCondition: AWSEncodableShape & AWSDecodableShape {
        /// The field in the HTTP request. The following are the possible values:    http-header     http-request-method     host-header     path-pattern     query-string     source-ip
        public let field: String?
        /// Information for a host header condition. Specify only when Field is host-header.
        public let hostHeaderConfig: HostHeaderConditionConfig?
        /// Information for an HTTP header condition. Specify only when Field is http-header.
        public let httpHeaderConfig: HttpHeaderConditionConfig?
        /// Information for an HTTP method condition. Specify only when Field is http-request-method.
        public let httpRequestMethodConfig: HttpRequestMethodConditionConfig?
        /// Information for a path pattern condition. Specify only when Field is path-pattern.
        public let pathPatternConfig: PathPatternConditionConfig?
        /// Information for a query string condition. Specify only when Field is query-string.
        public let queryStringConfig: QueryStringConditionConfig?
        /// The regular expressions to match against the condition field. The maximum length of each string is 128 characters. Specify only when Field is http-header, host-header, or path-pattern.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var regexValues: [String]?
        /// Information for a source IP condition. Specify only when Field is source-ip.
        public let sourceIpConfig: SourceIpConditionConfig?
        /// The condition value. Specify only when Field is host-header or path-pattern. Alternatively, to specify multiple host names or multiple path patterns, use HostHeaderConfig or PathPatternConfig. If Field is host-header and you are not using HostHeaderConfig, you can specify a single host name (for example, my.example.com) in Values. A host name is case insensitive, can be up to 128 characters in length, and can contain any of the following characters.   A-Z, a-z, 0-9   - .   * (matches 0 or more characters)   ? (matches exactly 1 character)   If Field is path-pattern and you are not using PathPatternConfig, you can specify a single path pattern (for example, /img/*) in Values. A path pattern is case-sensitive, can be up to 128 characters in length, and can contain any of the following characters.   A-Z, a-z, 0-9   _ - . $ / ~ " ' @ : +   & (using &amp;)   * (matches 0 or more characters)   ? (matches exactly 1 character)
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(field: String? = nil, hostHeaderConfig: HostHeaderConditionConfig? = nil, httpHeaderConfig: HttpHeaderConditionConfig? = nil, httpRequestMethodConfig: HttpRequestMethodConditionConfig? = nil, pathPatternConfig: PathPatternConditionConfig? = nil, queryStringConfig: QueryStringConditionConfig? = nil, regexValues: [String]? = nil, sourceIpConfig: SourceIpConditionConfig? = nil, values: [String]? = nil) {
            self.field = field
            self.hostHeaderConfig = hostHeaderConfig
            self.httpHeaderConfig = httpHeaderConfig
            self.httpRequestMethodConfig = httpRequestMethodConfig
            self.pathPatternConfig = pathPatternConfig
            self.queryStringConfig = queryStringConfig
            self.regexValues = regexValues
            self.sourceIpConfig = sourceIpConfig
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.field, name: "field", parent: name, max: 64)
        }

        private enum CodingKeys: String, CodingKey {
            case field = "Field"
            case hostHeaderConfig = "HostHeaderConfig"
            case httpHeaderConfig = "HttpHeaderConfig"
            case httpRequestMethodConfig = "HttpRequestMethodConfig"
            case pathPatternConfig = "PathPatternConfig"
            case queryStringConfig = "QueryStringConfig"
            case regexValues = "RegexValues"
            case sourceIpConfig = "SourceIpConfig"
            case values = "Values"
        }
    }

    public struct RulePriorityPair: AWSEncodableShape {
        /// The rule priority.
        public let priority: Int?
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String?

        @inlinable
        public init(priority: Int? = nil, ruleArn: String? = nil) {
            self.priority = priority
            self.ruleArn = ruleArn
        }

        public func validate(name: String) throws {
            try self.validate(self.priority, name: "priority", parent: name, max: 50000)
            try self.validate(self.priority, name: "priority", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case priority = "Priority"
            case ruleArn = "RuleArn"
        }
    }

    public struct RuleTransform: AWSEncodableShape & AWSDecodableShape {
        /// Information about a host header rewrite transform. This transform modifies the host header in an HTTP request. Specify only when Type is host-header-rewrite.
        public let hostHeaderRewriteConfig: HostHeaderRewriteConfig?
        /// The type of transform.     host-header-rewrite - Rewrite the host header.    url-rewrite - Rewrite the request URL.
        public let type: TransformTypeEnum?
        /// Information about a URL rewrite transform. This transform modifies the request URL. Specify only when Type is url-rewrite.
        public let urlRewriteConfig: UrlRewriteConfig?

        @inlinable
        public init(hostHeaderRewriteConfig: HostHeaderRewriteConfig? = nil, type: TransformTypeEnum? = nil, urlRewriteConfig: UrlRewriteConfig? = nil) {
            self.hostHeaderRewriteConfig = hostHeaderRewriteConfig
            self.type = type
            self.urlRewriteConfig = urlRewriteConfig
        }

        private enum CodingKeys: String, CodingKey {
            case hostHeaderRewriteConfig = "HostHeaderRewriteConfig"
            case type = "Type"
            case urlRewriteConfig = "UrlRewriteConfig"
        }
    }

    public struct SetIpAddressTypeInput: AWSEncodableShape {
        /// The IP address type. Internal load balancers must use ipv4. [Application Load Balancers] The possible values are ipv4 (IPv4 addresses),  dualstack (IPv4 and IPv6 addresses), and dualstack-without-public-ipv4  (public IPv6 addresses and private IPv4 and IPv6 addresses). Application Load Balancer authentication supports IPv4 addresses only when  connecting to an Identity Provider (IdP) or Amazon Cognito endpoint. Without a public  IPv4 address the load balancer can't complete the authentication process, resulting  in HTTP 500 errors. [Network Load Balancers and Gateway Load Balancers] The possible values are ipv4  (IPv4 addresses) and dualstack (IPv4 and IPv6 addresses).
        public let ipAddressType: IpAddressType?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?

        @inlinable
        public init(ipAddressType: IpAddressType? = nil, loadBalancerArn: String? = nil) {
            self.ipAddressType = ipAddressType
            self.loadBalancerArn = loadBalancerArn
        }

        private enum CodingKeys: String, CodingKey {
            case ipAddressType = "IpAddressType"
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct SetIpAddressTypeOutput: AWSDecodableShape {
        /// The IP address type.
        public let ipAddressType: IpAddressType?

        @inlinable
        public init(ipAddressType: IpAddressType? = nil) {
            self.ipAddressType = ipAddressType
        }

        private enum CodingKeys: String, CodingKey {
            case ipAddressType = "IpAddressType"
        }
    }

    public struct SetRulePrioritiesInput: AWSEncodableShape {
        /// The rule priorities.
        @OptionalCustomCoding<StandardArrayCoder<RulePriorityPair>>
        public var rulePriorities: [RulePriorityPair]?

        @inlinable
        public init(rulePriorities: [RulePriorityPair]? = nil) {
            self.rulePriorities = rulePriorities
        }

        public func validate(name: String) throws {
            try self.rulePriorities?.forEach {
                try $0.validate(name: "\(name).rulePriorities[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case rulePriorities = "RulePriorities"
        }
    }

    public struct SetRulePrioritiesOutput: AWSDecodableShape {
        /// Information about the rules.
        @OptionalCustomCoding<StandardArrayCoder<Rule>>
        public var rules: [Rule]?

        @inlinable
        public init(rules: [Rule]? = nil) {
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case rules = "Rules"
        }
    }

    public struct SetSecurityGroupsInput: AWSEncodableShape {
        /// Indicates whether to evaluate inbound security group rules for traffic sent to a  Network Load Balancer through Amazon Web Services PrivateLink. The default is on.
        public let enforceSecurityGroupInboundRulesOnPrivateLinkTraffic: EnforceSecurityGroupInboundRulesOnPrivateLinkTrafficEnum?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The IDs of the security groups.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var securityGroups: [String]?

        @inlinable
        public init(enforceSecurityGroupInboundRulesOnPrivateLinkTraffic: EnforceSecurityGroupInboundRulesOnPrivateLinkTrafficEnum? = nil, loadBalancerArn: String? = nil, securityGroups: [String]? = nil) {
            self.enforceSecurityGroupInboundRulesOnPrivateLinkTraffic = enforceSecurityGroupInboundRulesOnPrivateLinkTraffic
            self.loadBalancerArn = loadBalancerArn
            self.securityGroups = securityGroups
        }

        private enum CodingKeys: String, CodingKey {
            case enforceSecurityGroupInboundRulesOnPrivateLinkTraffic = "EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic"
            case loadBalancerArn = "LoadBalancerArn"
            case securityGroups = "SecurityGroups"
        }
    }

    public struct SetSecurityGroupsOutput: AWSDecodableShape {
        /// Indicates whether to evaluate inbound security group rules for traffic sent to a  Network Load Balancer through Amazon Web Services PrivateLink.
        public let enforceSecurityGroupInboundRulesOnPrivateLinkTraffic: EnforceSecurityGroupInboundRulesOnPrivateLinkTrafficEnum?
        /// The IDs of the security groups associated with the load balancer.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var securityGroupIds: [String]?

        @inlinable
        public init(enforceSecurityGroupInboundRulesOnPrivateLinkTraffic: EnforceSecurityGroupInboundRulesOnPrivateLinkTrafficEnum? = nil, securityGroupIds: [String]? = nil) {
            self.enforceSecurityGroupInboundRulesOnPrivateLinkTraffic = enforceSecurityGroupInboundRulesOnPrivateLinkTraffic
            self.securityGroupIds = securityGroupIds
        }

        private enum CodingKeys: String, CodingKey {
            case enforceSecurityGroupInboundRulesOnPrivateLinkTraffic = "EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic"
            case securityGroupIds = "SecurityGroupIds"
        }
    }

    public struct SetSubnetsInput: AWSEncodableShape {
        /// [Network Load Balancers with UDP listeners] Indicates whether to use an IPv6 prefix  from each subnet for source NAT. The IP address type must be dualstack. The default value is off.
        public let enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum?
        /// The IP address type. [Application Load Balancers] The possible values are ipv4 (IPv4 addresses),  dualstack (IPv4 and IPv6 addresses), and dualstack-without-public-ipv4  (public IPv6 addresses and private IPv4 and IPv6 addresses). [Network Load Balancers and Gateway Load Balancers] The possible values are ipv4  (IPv4 addresses) and dualstack (IPv4 and IPv6 addresses).
        public let ipAddressType: IpAddressType?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings. [Application Load Balancers] You must specify subnets from at least two Availability Zones. You can't specify Elastic IP addresses for your subnets. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers] You can specify subnets from one or more Availability Zones. You can specify one Elastic IP address per subnet if you need static IP addresses for your internet-facing load balancer. For internal load balancers, you can specify one private IP address per subnet from the IPv4 range of the subnet. For internet-facing load balancer, you can specify one IPv6 address per subnet. [Gateway Load Balancers] You can specify subnets from one or more Availability Zones.
        @OptionalCustomCoding<StandardArrayCoder<SubnetMapping>>
        public var subnetMappings: [SubnetMapping]?
        /// The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings. [Application Load Balancers] You must specify subnets from at least two Availability Zones. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers] You can specify subnets from one or more Availability Zones. [Gateway Load Balancers] You can specify subnets from one or more Availability Zones. You must include all subnets that were enabled previously, with their existing configurations,  plus any additional subnets.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var subnets: [String]?

        @inlinable
        public init(enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum? = nil, ipAddressType: IpAddressType? = nil, loadBalancerArn: String? = nil, subnetMappings: [SubnetMapping]? = nil, subnets: [String]? = nil) {
            self.enablePrefixForIpv6SourceNat = enablePrefixForIpv6SourceNat
            self.ipAddressType = ipAddressType
            self.loadBalancerArn = loadBalancerArn
            self.subnetMappings = subnetMappings
            self.subnets = subnets
        }

        private enum CodingKeys: String, CodingKey {
            case enablePrefixForIpv6SourceNat = "EnablePrefixForIpv6SourceNat"
            case ipAddressType = "IpAddressType"
            case loadBalancerArn = "LoadBalancerArn"
            case subnetMappings = "SubnetMappings"
            case subnets = "Subnets"
        }
    }

    public struct SetSubnetsOutput: AWSDecodableShape {
        /// Information about the subnets.
        @OptionalCustomCoding<StandardArrayCoder<AvailabilityZone>>
        public var availabilityZones: [AvailabilityZone]?
        /// [Network Load Balancers] Indicates whether to use an IPv6 prefix from each subnet for source NAT.
        public let enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum?
        /// The IP address type.
        public let ipAddressType: IpAddressType?

        @inlinable
        public init(availabilityZones: [AvailabilityZone]? = nil, enablePrefixForIpv6SourceNat: EnablePrefixForIpv6SourceNatEnum? = nil, ipAddressType: IpAddressType? = nil) {
            self.availabilityZones = availabilityZones
            self.enablePrefixForIpv6SourceNat = enablePrefixForIpv6SourceNat
            self.ipAddressType = ipAddressType
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case enablePrefixForIpv6SourceNat = "EnablePrefixForIpv6SourceNat"
            case ipAddressType = "IpAddressType"
        }
    }

    public struct SourceIpConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The source IP addresses, in CIDR format. You can use both IPv4 and IPv6 addresses. Wildcards are not supported. If you specify multiple addresses, the condition is satisfied if the source IP address of the request matches one of the CIDR blocks. This condition is not satisfied by the addresses in the X-Forwarded-For header. To search for addresses in the X-Forwarded-For header, use an HTTP header condition. The total number of values must be less than, or equal to five.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(values: [String]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct SslPolicy: AWSDecodableShape {
        /// The ciphers.
        @OptionalCustomCoding<StandardArrayCoder<Cipher>>
        public var ciphers: [Cipher]?
        /// The name of the policy.
        public let name: String?
        /// The protocols.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var sslProtocols: [String]?
        ///  The supported load balancers.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var supportedLoadBalancerTypes: [String]?

        @inlinable
        public init(ciphers: [Cipher]? = nil, name: String? = nil, sslProtocols: [String]? = nil, supportedLoadBalancerTypes: [String]? = nil) {
            self.ciphers = ciphers
            self.name = name
            self.sslProtocols = sslProtocols
            self.supportedLoadBalancerTypes = supportedLoadBalancerTypes
        }

        private enum CodingKeys: String, CodingKey {
            case ciphers = "Ciphers"
            case name = "Name"
            case sslProtocols = "SslProtocols"
            case supportedLoadBalancerTypes = "SupportedLoadBalancerTypes"
        }
    }

    public struct SubnetMapping: AWSEncodableShape {
        /// [Network Load Balancers] The allocation ID of the Elastic IP address for an internet-facing load balancer.
        public let allocationId: String?
        /// [Network Load Balancers] The IPv6 address.
        public let iPv6Address: String?
        /// [Network Load Balancers] The private IPv4 address for an internal load balancer.
        public let privateIPv4Address: String?
        /// [Network Load Balancers with UDP listeners] The IPv6 prefix to use for source NAT. Specify an IPv6 prefix (/80 netmask) from the subnet CIDR block or auto_assigned  to use an IPv6 prefix selected at random from the subnet CIDR block.
        public let sourceNatIpv6Prefix: String?
        /// The ID of the subnet.
        public let subnetId: String?

        @inlinable
        public init(allocationId: String? = nil, iPv6Address: String? = nil, privateIPv4Address: String? = nil, sourceNatIpv6Prefix: String? = nil, subnetId: String? = nil) {
            self.allocationId = allocationId
            self.iPv6Address = iPv6Address
            self.privateIPv4Address = privateIPv4Address
            self.sourceNatIpv6Prefix = sourceNatIpv6Prefix
            self.subnetId = subnetId
        }

        private enum CodingKeys: String, CodingKey {
            case allocationId = "AllocationId"
            case iPv6Address = "IPv6Address"
            case privateIPv4Address = "PrivateIPv4Address"
            case sourceNatIpv6Prefix = "SourceNatIpv6Prefix"
            case subnetId = "SubnetId"
        }
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The key of the tag.
        public let key: String?
        /// The value of the tag.
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            try self.validate(self.value, name: "value", parent: name, max: 256)
            try self.validate(self.value, name: "value", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TagDescription: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        public let resourceArn: String?
        /// Information about the tags.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(resourceArn: String? = nil, tags: [Tag]? = nil) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tags = "Tags"
        }
    }

    public struct TargetDescription: AWSEncodableShape & AWSDecodableShape {
        /// An Availability Zone or all. This determines whether the target receives  traffic from the load balancer nodes in the specified Availability Zone or from all enabled  Availability Zones for the load balancer. For Application Load Balancer target groups, the specified Availability Zone value is only applicable  when cross-zone load balancing is off. Otherwise the parameter is ignored and treated  as all. This parameter is not supported if the target type of the target group is instance or alb. If the target type is ip and the IP address is in a subnet of the VPC for the target group,  the Availability Zone is automatically detected and this parameter is optional. If the IP address is outside  the VPC, this parameter is required. For Application Load Balancer target groups with cross-zone load balancing off, if the target type  is ip and the IP address is outside of the VPC for the target group, this should be an  Availability Zone inside the VPC for the target group. If the target type is lambda, this parameter is optional and the only supported value is all.
        public let availabilityZone: String?
        /// The ID of the target. If the target type of the target group is instance, specify an instance ID. If the target type is ip, specify an IP address. If the target type is lambda, specify the ARN of the Lambda function. If the target type is alb, specify the ARN of the Application Load Balancer target.
        public let id: String?
        /// The port on which the target is listening. If the target group protocol is GENEVE, the supported port is 6081. If the target type is alb, the targeted Application Load Balancer must have at least one listener whose port matches the target group port. This  parameter is not used if the target is a Lambda function.
        public let port: Int?

        @inlinable
        public init(availabilityZone: String? = nil, id: String? = nil, port: Int? = nil) {
            self.availabilityZone = availabilityZone
            self.id = id
            self.port = port
        }

        public func validate(name: String) throws {
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "AvailabilityZone"
            case id = "Id"
            case port = "Port"
        }
    }

    public struct TargetGroup: AWSDecodableShape {
        /// Indicates whether health checks are enabled.
        public let healthCheckEnabled: Bool?
        /// The approximate amount of time, in seconds, between health checks of an individual target.
        public let healthCheckIntervalSeconds: Int?
        /// The destination for health checks on the targets.
        public let healthCheckPath: String?
        /// The port to use to connect with the target.
        public let healthCheckPort: String?
        /// The protocol to use to connect with the target. The GENEVE, TLS, UDP, and TCP_UDP protocols are not supported for health checks.
        public let healthCheckProtocol: ProtocolEnum?
        /// The amount of time, in seconds, during which no response means a failed health check.
        public let healthCheckTimeoutSeconds: Int?
        /// The number of consecutive health checks successes required before considering an unhealthy target healthy.
        public let healthyThresholdCount: Int?
        /// The IP address type. The default value is ipv4.
        public let ipAddressType: TargetGroupIpAddressTypeEnum?
        /// The Amazon Resource Name (ARN) of the load balancer that routes traffic to this target group. You can use each target group with only one load balancer.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var loadBalancerArns: [String]?
        /// The HTTP or gRPC codes to use when checking for a successful response from a target.
        public let matcher: Matcher?
        /// The port on which the targets are listening. This parameter is not used if the target is  a Lambda function.
        public let port: Int?
        /// The protocol to use for routing traffic to the targets.
        public let `protocol`: ProtocolEnum?
        /// [HTTP/HTTPS protocol] The protocol version. The possible values are GRPC, HTTP1, and HTTP2.
        public let protocolVersion: String?
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The name of the target group.
        public let targetGroupName: String?
        /// The type of target that you must specify when registering targets with this target group. The possible values are instance (register targets by instance ID), ip (register targets by IP address), lambda (register a single Lambda function as a target), or alb (register a single Application Load Balancer as a target).
        public let targetType: TargetTypeEnum?
        /// The number of consecutive health check failures required before considering the target unhealthy.
        public let unhealthyThresholdCount: Int?
        /// The ID of the VPC for the targets.
        public let vpcId: String?

        @inlinable
        public init(healthCheckEnabled: Bool? = nil, healthCheckIntervalSeconds: Int? = nil, healthCheckPath: String? = nil, healthCheckPort: String? = nil, healthCheckProtocol: ProtocolEnum? = nil, healthCheckTimeoutSeconds: Int? = nil, healthyThresholdCount: Int? = nil, ipAddressType: TargetGroupIpAddressTypeEnum? = nil, loadBalancerArns: [String]? = nil, matcher: Matcher? = nil, port: Int? = nil, protocol: ProtocolEnum? = nil, protocolVersion: String? = nil, targetGroupArn: String? = nil, targetGroupName: String? = nil, targetType: TargetTypeEnum? = nil, unhealthyThresholdCount: Int? = nil, vpcId: String? = nil) {
            self.healthCheckEnabled = healthCheckEnabled
            self.healthCheckIntervalSeconds = healthCheckIntervalSeconds
            self.healthCheckPath = healthCheckPath
            self.healthCheckPort = healthCheckPort
            self.healthCheckProtocol = healthCheckProtocol
            self.healthCheckTimeoutSeconds = healthCheckTimeoutSeconds
            self.healthyThresholdCount = healthyThresholdCount
            self.ipAddressType = ipAddressType
            self.loadBalancerArns = loadBalancerArns
            self.matcher = matcher
            self.port = port
            self.`protocol` = `protocol`
            self.protocolVersion = protocolVersion
            self.targetGroupArn = targetGroupArn
            self.targetGroupName = targetGroupName
            self.targetType = targetType
            self.unhealthyThresholdCount = unhealthyThresholdCount
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case healthCheckEnabled = "HealthCheckEnabled"
            case healthCheckIntervalSeconds = "HealthCheckIntervalSeconds"
            case healthCheckPath = "HealthCheckPath"
            case healthCheckPort = "HealthCheckPort"
            case healthCheckProtocol = "HealthCheckProtocol"
            case healthCheckTimeoutSeconds = "HealthCheckTimeoutSeconds"
            case healthyThresholdCount = "HealthyThresholdCount"
            case ipAddressType = "IpAddressType"
            case loadBalancerArns = "LoadBalancerArns"
            case matcher = "Matcher"
            case port = "Port"
            case `protocol` = "Protocol"
            case protocolVersion = "ProtocolVersion"
            case targetGroupArn = "TargetGroupArn"
            case targetGroupName = "TargetGroupName"
            case targetType = "TargetType"
            case unhealthyThresholdCount = "UnhealthyThresholdCount"
            case vpcId = "VpcId"
        }
    }

    public struct TargetGroupAttribute: AWSEncodableShape & AWSDecodableShape {
        /// The name of the attribute. The following attributes are supported by all load balancers:    deregistration_delay.timeout_seconds - The amount of time, in seconds, for Elastic Load Balancing to wait before changing the state of a deregistering target from draining to unused. The range is 0-3600 seconds. The default value is 300 seconds. If the target is a Lambda function, this attribute is not supported.    stickiness.enabled - Indicates whether target stickiness is enabled. The value is true or false. The default is false.    stickiness.type - Indicates the type of stickiness. The possible values are:    lb_cookie and app_cookie for Application Load Balancers.    source_ip for Network Load Balancers.    source_ip_dest_ip and source_ip_dest_ip_proto for Gateway Load Balancers.     The following attributes are supported by Application Load Balancers and  Network Load Balancers:    load_balancing.cross_zone.enabled - Indicates whether cross zone load  balancing is enabled. The value is true, false or  use_load_balancer_configuration. The default is  use_load_balancer_configuration.    target_group_health.dns_failover.minimum_healthy_targets.count -  The minimum number of targets that must be healthy. If the number of healthy targets is below this value, mark the zone as unhealthy in DNS, so that traffic is routed only to healthy zones. The possible values are off or an integer from 1 to the maximum number of targets. The default is 1.    target_group_health.dns_failover.minimum_healthy_targets.percentage -  The minimum percentage of targets that must be healthy. If the percentage of healthy targets is below this value, mark the zone as unhealthy in DNS, so that traffic is routed only to healthy zones. The possible values are off or an integer from 1 to 100. The default is off.    target_group_health.unhealthy_state_routing.minimum_healthy_targets.count -  The minimum number of targets that must be healthy.   If the number of healthy targets is below this value, send traffic to all targets, including unhealthy targets. The possible values are 1 to the maximum number of targets. The default is 1.    target_group_health.unhealthy_state_routing.minimum_healthy_targets.percentage -  The minimum percentage of targets that must be healthy.  If the percentage of healthy targets is below this value, send traffic to all targets, including unhealthy targets. The possible values are off or an integer from 1 to 100. The default is off.   The following attributes are supported only if the load balancer is an Application Load Balancer and the target is an instance or an IP address:    load_balancing.algorithm.type - The load balancing algorithm determines how the load balancer selects targets when routing requests. The value is round_robin, least_outstanding_requests, or weighted_random. The default is round_robin.    load_balancing.algorithm.anomaly_mitigation - Only available when load_balancing.algorithm.type  is weighted_random. Indicates whether anomaly mitigation is enabled. The value is on  or off. The default is off.    slow_start.duration_seconds - The time period, in seconds, during which a newly registered target receives an increasing share of the traffic to the target group. After this time period ends, the target receives its full share of traffic. The range is 30-900 seconds (15 minutes). The default is 0 seconds (disabled).    stickiness.app_cookie.cookie_name - Indicates the name of the application-based cookie. Names that start with the following prefixes are not allowed: AWSALB, AWSALBAPP, and AWSALBTG; they're reserved for use by the load balancer.    stickiness.app_cookie.duration_seconds - The time period, in seconds, during which requests from a client should be routed to the same target. After this time period expires, the application-based cookie is considered stale. The range is 1 second to 1 week (604800 seconds). The default value is 1 day (86400 seconds).    stickiness.lb_cookie.duration_seconds - The time period, in seconds, during which requests from a client should be routed to the same target. After this time period expires, the load balancer-generated cookie is considered stale. The range is 1 second to 1 week (604800 seconds). The default value is 1 day (86400 seconds).    The following attribute is supported only if the load balancer is an Application Load Balancer and the target is a Lambda function:    lambda.multi_value_headers.enabled - Indicates whether the request and response headers that are exchanged between the load balancer and the Lambda function include arrays of values or strings. The value is true or false. The default is false. If the value is false and the request contains a duplicate header field name or query parameter key, the load balancer uses the last value sent by the client.   The following attributes are supported only by Network Load Balancers:    deregistration_delay.connection_termination.enabled - Indicates whether the load balancer terminates connections at the end of the deregistration timeout. The value is true or false. For new UDP/TCP_UDP target groups the  default is true. Otherwise, the default is false.    preserve_client_ip.enabled - Indicates whether client IP preservation is enabled. The value is true or false. The default is disabled if the target group type is IP address and the target group protocol is TCP or TLS. Otherwise, the default is enabled. Client IP preservation can't be disabled for UDP and TCP_UDP target groups.    proxy_protocol_v2.enabled - Indicates whether Proxy Protocol version 2 is enabled. The value is true or false. The default is false.     target_health_state.unhealthy.connection_termination.enabled - Indicates whether  the load balancer terminates connections to unhealthy targets. The value is true  or false. The default is true. This attribute can't be enabled for UDP and TCP_UDP target groups.    target_health_state.unhealthy.draining_interval_seconds - The amount of time  for Elastic Load Balancing to wait before changing the state of an unhealthy target from  unhealthy.draining to unhealthy. The range is 0-360000 seconds.  The default value is 0 seconds. Note: This attribute can only be configured when  target_health_state.unhealthy.connection_termination.enabled is false.   The following attributes are supported only by Gateway Load Balancers:    target_failover.on_deregistration - Indicates how the Gateway Load Balancer handles existing flows when a target is deregistered. The possible values are rebalance and no_rebalance. The default is no_rebalance. The two attributes (target_failover.on_deregistration and target_failover.on_unhealthy) can't be set independently. The value you set for both attributes must be the same.      target_failover.on_unhealthy - Indicates how the Gateway Load Balancer handles existing flows when a target is unhealthy. The possible values are rebalance and no_rebalance. The default is no_rebalance. The two attributes (target_failover.on_deregistration and target_failover.on_unhealthy) can't be set independently. The value you set for both attributes must be the same.
        public let key: String?
        /// The value of the attribute.
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 256)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[a-zA-Z0-9._]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TargetGroupStickinessConfig: AWSEncodableShape & AWSDecodableShape {
        /// The time period, in seconds, during which requests from a client should be routed to the same target group. The range is 1-604800 seconds (7 days). You must specify this value when enabling target group stickiness.
        public let durationSeconds: Int?
        /// Indicates whether target group stickiness is enabled.
        public let enabled: Bool?

        @inlinable
        public init(durationSeconds: Int? = nil, enabled: Bool? = nil) {
            self.durationSeconds = durationSeconds
            self.enabled = enabled
        }

        private enum CodingKeys: String, CodingKey {
            case durationSeconds = "DurationSeconds"
            case enabled = "Enabled"
        }
    }

    public struct TargetGroupTuple: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The weight. The range is 0 to 999.
        public let weight: Int?

        @inlinable
        public init(targetGroupArn: String? = nil, weight: Int? = nil) {
            self.targetGroupArn = targetGroupArn
            self.weight = weight
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
            case weight = "Weight"
        }
    }

    public struct TargetHealth: AWSDecodableShape {
        /// A description of the target health that provides additional details. If the state is healthy, a description is not provided.
        public let description: String?
        /// The reason code. If the target state is healthy, a reason code is not provided. If the target state is initial, the reason code can be one of the following values:    Elb.RegistrationInProgress - The target is in the process of being registered with the load balancer.    Elb.InitialHealthChecking - The load balancer is still sending the target the minimum number of health checks required to determine its health status.   If the target state is unhealthy, the reason code can be one of the following values:    Target.ResponseCodeMismatch - The health checks did not return an expected HTTP code. Applies only to Application Load Balancers and Gateway Load Balancers.    Target.Timeout - The health check requests timed out. Applies only to Application Load Balancers and Gateway Load Balancers.    Target.FailedHealthChecks - The load balancer received an error while establishing a connection to the target or the target response was malformed.    Elb.InternalError - The health checks failed due to an internal error. Applies only to Application Load Balancers.   If the target state is unused, the reason code can be one of the following values:    Target.NotRegistered - The target is not registered with the target group.    Target.NotInUse - The target group is not used by any load balancer or the target is in an Availability Zone that is not enabled for its load balancer.    Target.InvalidState - The target is in the stopped or terminated state.    Target.IpUnusable - The target IP address is reserved for use by a load balancer.   If the target state is draining, the reason code can be the following value:    Target.DeregistrationInProgress - The target is in the process of being deregistered and the deregistration delay period has not expired.   If the target state is unavailable, the reason code can be the following value:    Target.HealthCheckDisabled - Health checks are disabled for the target group. Applies only to Application Load Balancers.    Elb.InternalError - Target health is unavailable due to an internal error. Applies only to Network Load Balancers.
        public let reason: TargetHealthReasonEnum?
        /// The state of the target.
        public let state: TargetHealthStateEnum?

        @inlinable
        public init(description: String? = nil, reason: TargetHealthReasonEnum? = nil, state: TargetHealthStateEnum? = nil) {
            self.description = description
            self.reason = reason
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case reason = "Reason"
            case state = "State"
        }
    }

    public struct TargetHealthDescription: AWSDecodableShape {
        /// The administrative override information for the target.
        public let administrativeOverride: AdministrativeOverride?
        /// The anomaly detection result for the target. If no anomalies were detected, the result is normal. If anomalies were detected, the result is anomalous.
        public let anomalyDetection: AnomalyDetection?
        /// The port to use to connect with the target.
        public let healthCheckPort: String?
        /// The description of the target.
        public let target: TargetDescription?
        /// The health information for the target.
        public let targetHealth: TargetHealth?

        @inlinable
        public init(administrativeOverride: AdministrativeOverride? = nil, anomalyDetection: AnomalyDetection? = nil, healthCheckPort: String? = nil, target: TargetDescription? = nil, targetHealth: TargetHealth? = nil) {
            self.administrativeOverride = administrativeOverride
            self.anomalyDetection = anomalyDetection
            self.healthCheckPort = healthCheckPort
            self.target = target
            self.targetHealth = targetHealth
        }

        private enum CodingKeys: String, CodingKey {
            case administrativeOverride = "AdministrativeOverride"
            case anomalyDetection = "AnomalyDetection"
            case healthCheckPort = "HealthCheckPort"
            case target = "Target"
            case targetHealth = "TargetHealth"
        }
    }

    public struct TrustStore: AWSDecodableShape {
        /// The name of the trust store.
        public let name: String?
        /// The number of ca certificates in the trust store.
        public let numberOfCaCertificates: Int?
        /// The current status of the trust store.
        public let status: TrustStoreStatus?
        /// The number of revoked certificates in the trust store.
        public let totalRevokedEntries: Int64?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(name: String? = nil, numberOfCaCertificates: Int? = nil, status: TrustStoreStatus? = nil, totalRevokedEntries: Int64? = nil, trustStoreArn: String? = nil) {
            self.name = name
            self.numberOfCaCertificates = numberOfCaCertificates
            self.status = status
            self.totalRevokedEntries = totalRevokedEntries
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case numberOfCaCertificates = "NumberOfCaCertificates"
            case status = "Status"
            case totalRevokedEntries = "TotalRevokedEntries"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct TrustStoreAssociation: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        public let resourceArn: String?

        @inlinable
        public init(resourceArn: String? = nil) {
            self.resourceArn = resourceArn
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
        }
    }

    public struct TrustStoreRevocation: AWSDecodableShape {
        /// The number of revoked certificates.
        public let numberOfRevokedEntries: Int64?
        /// The revocation ID of the revocation file.
        public let revocationId: Int64?
        /// The type of revocation file.
        public let revocationType: RevocationType?
        /// The Amazon Resource Name (ARN) of the trust store.
        public let trustStoreArn: String?

        @inlinable
        public init(numberOfRevokedEntries: Int64? = nil, revocationId: Int64? = nil, revocationType: RevocationType? = nil, trustStoreArn: String? = nil) {
            self.numberOfRevokedEntries = numberOfRevokedEntries
            self.revocationId = revocationId
            self.revocationType = revocationType
            self.trustStoreArn = trustStoreArn
        }

        private enum CodingKeys: String, CodingKey {
            case numberOfRevokedEntries = "NumberOfRevokedEntries"
            case revocationId = "RevocationId"
            case revocationType = "RevocationType"
            case trustStoreArn = "TrustStoreArn"
        }
    }

    public struct UrlRewriteConfig: AWSEncodableShape & AWSDecodableShape {
        /// The URL rewrite transform to apply to the request. The transform consists of a regular expression to match and a replacement string.
        @OptionalCustomCoding<StandardArrayCoder<RewriteConfig>>
        public var rewrites: [RewriteConfig]?

        @inlinable
        public init(rewrites: [RewriteConfig]? = nil) {
            self.rewrites = rewrites
        }

        private enum CodingKeys: String, CodingKey {
            case rewrites = "Rewrites"
        }
    }

    public struct ZonalCapacityReservationState: AWSDecodableShape {
        /// Information about the Availability Zone.
        public let availabilityZone: String?
        /// The number of effective capacity units.
        public let effectiveCapacityUnits: Double?
        /// The state of the capacity reservation.
        public let state: CapacityReservationStatus?

        @inlinable
        public init(availabilityZone: String? = nil, effectiveCapacityUnits: Double? = nil, state: CapacityReservationStatus? = nil) {
            self.availabilityZone = availabilityZone
            self.effectiveCapacityUnits = effectiveCapacityUnits
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "AvailabilityZone"
            case effectiveCapacityUnits = "EffectiveCapacityUnits"
            case state = "State"
        }
    }
}

// MARK: - Errors

/// Error enum for ElasticLoadBalancingV2
public struct ElasticLoadBalancingV2ErrorType: AWSErrorType {
    enum Code: String {
        case allocationIdNotFoundException = "AllocationIdNotFound"
        case alpnPolicyNotSupportedException = "ALPNPolicyNotFound"
        case availabilityZoneNotSupportedException = "AvailabilityZoneNotSupported"
        case caCertificatesBundleNotFoundException = "CaCertificatesBundleNotFound"
        case capacityDecreaseRequestsLimitExceededException = "CapacityDecreaseRequestLimitExceeded"
        case capacityReservationPendingException = "CapacityReservationPending"
        case capacityUnitsLimitExceededException = "CapacityUnitsLimitExceeded"
        case certificateNotFoundException = "CertificateNotFound"
        case deleteAssociationSameAccountException = "DeleteAssociationSameAccount"
        case duplicateListenerException = "DuplicateListener"
        case duplicateLoadBalancerNameException = "DuplicateLoadBalancerName"
        case duplicateTagKeysException = "DuplicateTagKeys"
        case duplicateTargetGroupNameException = "DuplicateTargetGroupName"
        case duplicateTrustStoreNameException = "DuplicateTrustStoreName"
        case healthUnavailableException = "HealthUnavailable"
        case incompatibleProtocolsException = "IncompatibleProtocols"
        case insufficientCapacityException = "InsufficientCapacity"
        case invalidCaCertificatesBundleException = "InvalidCaCertificatesBundle"
        case invalidConfigurationRequestException = "InvalidConfigurationRequest"
        case invalidLoadBalancerActionException = "InvalidLoadBalancerAction"
        case invalidRevocationContentException = "InvalidRevocationContent"
        case invalidSchemeException = "InvalidScheme"
        case invalidSecurityGroupException = "InvalidSecurityGroup"
        case invalidSubnetException = "InvalidSubnet"
        case invalidTargetException = "InvalidTarget"
        case listenerNotFoundException = "ListenerNotFound"
        case loadBalancerNotFoundException = "LoadBalancerNotFound"
        case operationNotPermittedException = "OperationNotPermitted"
        case priorRequestNotCompleteException = "PriorRequestNotComplete"
        case priorityInUseException = "PriorityInUse"
        case resourceInUseException = "ResourceInUse"
        case resourceNotFoundException = "ResourceNotFound"
        case revocationContentNotFoundException = "RevocationContentNotFound"
        case revocationIdNotFoundException = "RevocationIdNotFound"
        case ruleNotFoundException = "RuleNotFound"
        case sslPolicyNotFoundException = "SSLPolicyNotFound"
        case subnetNotFoundException = "SubnetNotFound"
        case targetGroupAssociationLimitException = "TargetGroupAssociationLimit"
        case targetGroupNotFoundException = "TargetGroupNotFound"
        case tooManyActionsException = "TooManyActions"
        case tooManyCertificatesException = "TooManyCertificates"
        case tooManyListenersException = "TooManyListeners"
        case tooManyLoadBalancersException = "TooManyLoadBalancers"
        case tooManyRegistrationsForTargetIdException = "TooManyRegistrationsForTargetId"
        case tooManyRulesException = "TooManyRules"
        case tooManyTagsException = "TooManyTags"
        case tooManyTargetGroupsException = "TooManyTargetGroups"
        case tooManyTargetsException = "TooManyTargets"
        case tooManyTrustStoreRevocationEntriesException = "TooManyTrustStoreRevocationEntries"
        case tooManyTrustStoresException = "TooManyTrustStores"
        case tooManyUniqueTargetGroupsPerLoadBalancerException = "TooManyUniqueTargetGroupsPerLoadBalancer"
        case trustStoreAssociationNotFoundException = "AssociationNotFound"
        case trustStoreInUseException = "TrustStoreInUse"
        case trustStoreNotFoundException = "TrustStoreNotFound"
        case trustStoreNotReadyException = "TrustStoreNotReady"
        case unsupportedProtocolException = "UnsupportedProtocol"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize ElasticLoadBalancingV2
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// The specified allocation ID does not exist.
    public static var allocationIdNotFoundException: Self { .init(.allocationIdNotFoundException) }
    /// The specified ALPN policy is not supported.
    public static var alpnPolicyNotSupportedException: Self { .init(.alpnPolicyNotSupportedException) }
    /// The specified Availability Zone is not supported.
    public static var availabilityZoneNotSupportedException: Self { .init(.availabilityZoneNotSupportedException) }
    /// The specified ca certificate bundle does not exist.
    public static var caCertificatesBundleNotFoundException: Self { .init(.caCertificatesBundleNotFoundException) }
    /// You've exceeded the daily capacity decrease limit for this reservation.
    public static var capacityDecreaseRequestsLimitExceededException: Self { .init(.capacityDecreaseRequestsLimitExceededException) }
    /// There is a pending capacity reservation.
    public static var capacityReservationPendingException: Self { .init(.capacityReservationPendingException) }
    /// You've exceeded the capacity units limit.
    public static var capacityUnitsLimitExceededException: Self { .init(.capacityUnitsLimitExceededException) }
    /// The specified certificate does not exist.
    public static var certificateNotFoundException: Self { .init(.certificateNotFoundException) }
    /// The specified association can't be within the same account.
    public static var deleteAssociationSameAccountException: Self { .init(.deleteAssociationSameAccountException) }
    /// A listener with the specified port already exists.
    public static var duplicateListenerException: Self { .init(.duplicateListenerException) }
    /// A load balancer with the specified name already exists.
    public static var duplicateLoadBalancerNameException: Self { .init(.duplicateLoadBalancerNameException) }
    /// A tag key was specified more than once.
    public static var duplicateTagKeysException: Self { .init(.duplicateTagKeysException) }
    /// A target group with the specified name already exists.
    public static var duplicateTargetGroupNameException: Self { .init(.duplicateTargetGroupNameException) }
    /// A trust store with the specified name already exists.
    public static var duplicateTrustStoreNameException: Self { .init(.duplicateTrustStoreNameException) }
    /// The health of the specified targets could not be retrieved due to an internal error.
    public static var healthUnavailableException: Self { .init(.healthUnavailableException) }
    /// The specified configuration is not valid with this protocol.
    public static var incompatibleProtocolsException: Self { .init(.incompatibleProtocolsException) }
    /// There is insufficient capacity to reserve.
    public static var insufficientCapacityException: Self { .init(.insufficientCapacityException) }
    /// The specified ca certificate bundle is in an invalid format, or corrupt.
    public static var invalidCaCertificatesBundleException: Self { .init(.invalidCaCertificatesBundleException) }
    /// The requested configuration is not valid.
    public static var invalidConfigurationRequestException: Self { .init(.invalidConfigurationRequestException) }
    /// The requested action is not valid.
    public static var invalidLoadBalancerActionException: Self { .init(.invalidLoadBalancerActionException) }
    /// The provided revocation file is an invalid format, or uses an incorrect algorithm.
    public static var invalidRevocationContentException: Self { .init(.invalidRevocationContentException) }
    /// The requested scheme is not valid.
    public static var invalidSchemeException: Self { .init(.invalidSchemeException) }
    /// The specified security group does not exist.
    public static var invalidSecurityGroupException: Self { .init(.invalidSecurityGroupException) }
    /// The specified subnet is out of available addresses.
    public static var invalidSubnetException: Self { .init(.invalidSubnetException) }
    /// The specified target does not exist, is not in the same VPC as the target group, or has an unsupported instance type.
    public static var invalidTargetException: Self { .init(.invalidTargetException) }
    /// The specified listener does not exist.
    public static var listenerNotFoundException: Self { .init(.listenerNotFoundException) }
    /// The specified load balancer does not exist.
    public static var loadBalancerNotFoundException: Self { .init(.loadBalancerNotFoundException) }
    /// This operation is not allowed.
    public static var operationNotPermittedException: Self { .init(.operationNotPermittedException) }
    /// This operation is not allowed while a prior request has not been completed.
    public static var priorRequestNotCompleteException: Self { .init(.priorRequestNotCompleteException) }
    /// The specified priority is in use.
    public static var priorityInUseException: Self { .init(.priorityInUseException) }
    /// A specified resource is in use.
    public static var resourceInUseException: Self { .init(.resourceInUseException) }
    /// The specified resource does not exist.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// The specified revocation file does not exist.
    public static var revocationContentNotFoundException: Self { .init(.revocationContentNotFoundException) }
    /// The specified revocation ID does not exist.
    public static var revocationIdNotFoundException: Self { .init(.revocationIdNotFoundException) }
    /// The specified rule does not exist.
    public static var ruleNotFoundException: Self { .init(.ruleNotFoundException) }
    /// The specified SSL policy does not exist.
    public static var sslPolicyNotFoundException: Self { .init(.sslPolicyNotFoundException) }
    /// The specified subnet does not exist.
    public static var subnetNotFoundException: Self { .init(.subnetNotFoundException) }
    /// You've reached the limit on the number of load balancers per target group.
    public static var targetGroupAssociationLimitException: Self { .init(.targetGroupAssociationLimitException) }
    /// The specified target group does not exist.
    public static var targetGroupNotFoundException: Self { .init(.targetGroupNotFoundException) }
    /// You've reached the limit on the number of actions per rule.
    public static var tooManyActionsException: Self { .init(.tooManyActionsException) }
    /// You've reached the limit on the number of certificates per load balancer.
    public static var tooManyCertificatesException: Self { .init(.tooManyCertificatesException) }
    /// You've reached the limit on the number of listeners per load balancer.
    public static var tooManyListenersException: Self { .init(.tooManyListenersException) }
    /// You've reached the limit on the number of load balancers for your Amazon Web Services account.
    public static var tooManyLoadBalancersException: Self { .init(.tooManyLoadBalancersException) }
    /// You've reached the limit on the number of times a target can be registered with a load balancer.
    public static var tooManyRegistrationsForTargetIdException: Self { .init(.tooManyRegistrationsForTargetIdException) }
    /// You've reached the limit on the number of rules per load balancer.
    public static var tooManyRulesException: Self { .init(.tooManyRulesException) }
    /// You've reached the limit on the number of tags for this resource.
    public static var tooManyTagsException: Self { .init(.tooManyTagsException) }
    /// You've reached the limit on the number of target groups for your Amazon Web Services account.
    public static var tooManyTargetGroupsException: Self { .init(.tooManyTargetGroupsException) }
    /// You've reached the limit on the number of targets.
    public static var tooManyTargetsException: Self { .init(.tooManyTargetsException) }
    /// The specified trust store has too many revocation entries.
    public static var tooManyTrustStoreRevocationEntriesException: Self { .init(.tooManyTrustStoreRevocationEntriesException) }
    /// You've reached the limit on the number of trust stores for your Amazon Web Services account.
    public static var tooManyTrustStoresException: Self { .init(.tooManyTrustStoresException) }
    /// You've reached the limit on the number of unique target groups per load balancer across all listeners. If a target group is used by multiple actions for a load balancer, it is counted as only one use.
    public static var tooManyUniqueTargetGroupsPerLoadBalancerException: Self { .init(.tooManyUniqueTargetGroupsPerLoadBalancerException) }
    /// The specified association does not exist.
    public static var trustStoreAssociationNotFoundException: Self { .init(.trustStoreAssociationNotFoundException) }
    /// The specified trust store is currently in use.
    public static var trustStoreInUseException: Self { .init(.trustStoreInUseException) }
    /// The specified trust store does not exist.
    public static var trustStoreNotFoundException: Self { .init(.trustStoreNotFoundException) }
    /// The specified trust store is not active.
    public static var trustStoreNotReadyException: Self { .init(.trustStoreNotReadyException) }
    /// The specified protocol is not supported.
    public static var unsupportedProtocolException: Self { .init(.unsupportedProtocolException) }
}

extension ElasticLoadBalancingV2ErrorType: Equatable {
    public static func == (lhs: ElasticLoadBalancingV2ErrorType, rhs: ElasticLoadBalancingV2ErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension ElasticLoadBalancingV2ErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
